今天非常无聊的决定去试一下python。找了一个题,大意如下:
- 给定一个输入字符串,找出最漂亮的无重复子字符串。
- 子字符串:从原字符串中减掉某些字符可得到的。
- 无重复字符串:没有重复的字符
- 甲比乙漂亮:甲的长度>乙,或者甲的字典排序在乙之后。
因为都是无重复的,所以肯定不需要甲的长度大于乙,故而是所有长度一样的无重复子字符串中,找出字典排序最大的。
这个先用R写的,为的是写出一个有效的算法来。基本的思路就是强行的逐层递归。
x = 'nlhthgrfdnnlprjtecpdrthigjoqdejsfkasoctjijaoebqlrgaiakfsbljmpibkidjsrtkgrdnqsknbarpabgokbsrfhmeklrle'
x_split = strsplit(x,split="")[[1]]
unique_x = unique(x_split)
unique_x_order = sort(unique_x,decreasing=T)
x_remain = character()
# find the largest character than can be remained
#initialize
current_string = x_split
current_unique = unique_x
current_order = unique_x_order
while ( length(x_remain) < 20)
{
for(i in 1:length(current_order))
{ character = current_order[i]
index = which(current_string == character)
sub_string = current_string[min(index):length(current_string)]
if (length(setdiff(unique(current_string),unique(sub_string)))==0) #no lose of characters
{x_remain = c(x_remain,character);
current_string = current_string[-c(1:min(index),index)];
current_unique = unique(current_string);
current_order = sort(current_unique,decreasing=T);
break;
}
}
}
#answer is 'tsocrpkijgdqnbafhmle'
后面用python重写了一遍。基本就是等价函数的替换...我是不是在暴殄天物的利用python?完全不理解program on the fly的感觉...
x = 'nlhthgrfdnnlprjtecpdrthigjoqdejsfkasoctjijaoebqlrgaiakfsbljmpibkidjsrtkgrdnqsknbarpabgokbsrfhmeklrle';
x_split = list(x);
unique_x = list(set(x_split));
unique_x.sort(reverse=True)
x_remain = list();
###initialize
current_string = x_split;current_unique = unique_x;current_order = unique_x;
while len(x_remain) < len(unique_x):
for character in current_order:
index = current_string.index(character);
sub_string = current_string[index:len(current_string)];
#print(character);
if (len(set(current_string)-set(sub_string))==0): #no lose of characters
x_remain.append(character);
for i in range(sub_string.count(character)):
sub_string.remove(character);
current_string= sub_string;
current_unique = list(set(current_string));
current_unique.sort(reverse=True);
current_order = current_unique;
break;
print(x_remain);
最后好不容易写完python之后,发现网断了...没法在线提交了。等重新连上,时间已经过了,sigh。就当周末无聊历练一下了。