所以这是我用Python编写的第一个程序之一。我正在尝试取一个字符串,并输出所有真正的单词字符串。我已经完成了(我需要找到一个包含更多单词的参考文件)但是它不可扩展,因为我不能输入超过8个字符而没有Python需要很长时间才能返回。
def lower_and_remove_spaces(fill_string):
'''
function takes a string of 2 or more characters and prints out all the permutations
of words that the characters can make.
'''
lower_string = ''
for i in fill_string:
if i.isalpha():
lower_string += i.lower()
return lower_string
def fill_list(input_string):
iter_list = []
string_list = []
this_string = lower_and_remove_spaces(input_string)
for num in range(2,len(this_string)+1):
iter_list.append(itertools.permutations(this_string,num))
for iters in iter_list:
for lists in iters:
string_list.append(list(lists))
return string_list
def word_list(string):
string_list = fill_list(string)
a_word_list = []
a_string = ''
for i in string_list:
if not a_string == '':
a_word_list.append(a_string)
a_string = ''
for y in i:
a_string += y
return a_word_list
据我所知,这种情况很多,但我想知道什么是更好的方法,以便它可以扩展?
答案 0 :(得分:5)
一些快速的想法:让所有的排列都变成O(n!),没有办法解决这个问题。即使您优化了代码,当n接近更大的数字时,您仍会遇到问题。如果你有一个有效单词的字典,这个问题有点不同。在病理输入集(您的字典包含所有排列)下,您不能做得比这更好。
但是,您可以执行以下操作
在实践中,这种表现要比O(n!)
好得多如果您不熟悉前缀树,可以使用Python哈希来模拟相同的事情
def prefix_hash(list_o_words):
ret = {}
for word in list_o_words:
for i in range(2,len(word)-1):
ret[word[:i]] = 'prefix' # this should check if it's a word first..
ret[word] = 'word'
如果您需要更多帮助,请提出问题。