我试图制作一个 anagram算法,但是一旦我进入递归部分,我就陷入了困境。如果需要更多信息,请告诉我。
我的代码:
def ana_words(words, letter_count):
"""Return all the anagrams using the given letters and allowed words.
- letter_count has 26 keys (one per lowercase letter),
and each value is a non-negative integer.
@type words: list[str]
@type letter_count: dict[str, int]
@rtype: list[str]
"""
anagrams_list = []
if not letter_count:
return [""]
for word in words:
if not _within_letter_count(word, letter_count):
continue
new_letter_count = dict(letter_count)
for char in word:
new_letter_count[char] -= 1
# recursive function
var1 = ana_words(words[1:], new_letter_count)
sorted_word = ''.join(word)
for i in var1:
sorted_word = ''.join([word, i])
anagrams_list.append(sorted_word)
return anagrams_list
单词是文件中的单词列表,字母计数是字符字典(已经是小写)。单词中的单词列表也已经是小写的。
输入:打印ana_words('宿舍')
输出我得到:
['dirtyroom', 'dotoi', 'doori', 'dormitory', 'drytoori', 'itorod', 'ortoidry', 'rodtoi', 'roomidry', 'rootidry', 'torodi']
我想要的输出:
['dirty room', 'dormitory', 'room dirty']
答案 0 :(得分:0)
在不知道你的单词列表的情况下,很难说出为什么会包含“错误”字样。条目。尝试使用
words = ['room','dirty','dormitory']
返回正确的条目。
如果您想要更改单词之间的空格
sorted_word = ''.join([word, i])
到
sorted_word = ' '.join([word, i])
(注意增加的空间)
顺便提一下,如果您想要更有效地解决这个问题,那么使用' trie'存储单词的数据结构可以提供帮助(https://en.wikipedia.org/wiki/Trie)
答案 1 :(得分:0)
问题错误:
你在说:
单词是文件中的单词列表,字母计数是字符字典(已小写)。单词中的单词列表也是小写的。
但实际上你是以不同的方式调用函数:
print ana_words('dormitory')
这不对。
检查词典值是否全部为0:
if not letter_count:
没有达到您的预期。要检查字典是否全部为0,您应该首先获取值if not any(letter_count.values()):
,检查它们是否与0不同,然后否定答案。
加入词语
str.join(arg1)
方法不是用于连接2个单词,用于加入由字符串作为arg1传递的迭代,在您的情况下,字符串是可迭代的字符,并且您没有任何连接,因此结果是相同的字。
''.join('Hello')
>>> 'Hello'
第二次使用它时,iterable是列表,它与var1的每个元素连接,这实际上是一个单词列表,所以很好地排除了你在这里缺少的空间。问题是你没有对sorted_words做任何事情。您刚刚使用它上次出现的时间。 anagram_list.append(sorted_word)
应位于循环内,sorted_word = ''.join(word)
应删除。
其他错误:
除了所有这些错误之外,你永远不会检查字母数是否达到0来停止递归。