我正在为带有建议的拼写检查器构建一棵树。每个节点都包含一个键(一个字母)和一个值(沿着该路径的字母数组)。
所以假设我的大特里有以下子特里:
W
/ \
a e
| |
k k
| |
is word--> e e
|
...
这只是子树的子路径。W 是一个节点,a 和 e 是其值数组中的两个节点,等等......
在每个节点,我检查单词中的下一个字母是否是节点的值。我现在正在尝试支持错误输入的元音。所以 'weke' 将产生 'wake' 作为建议。这是我searchWord
在尝试中的功能:
def searchWord(self, word, path=""):
if len(word) > 0:
key = word[0]
word = word[1:]
if self.values.has_key(key):
path = path + key
nextNode = self.values[key]
return nextNode.searchWord(word, path)
else:
# check here if key is a vowel. If it is, check for other vowel substitutes
else:
if self.isWord:
return path # this is the word found
else:
return None
给定“weke”,最后当单词长度为零且路径为“weke”时,我的代码将命中第二个大 else 块。weke
未标记为单词,因此它将返回 None。这将返回searchWord
无。
为了避免这种情况,在每次堆栈展开或递归回溯时,我需要检查一个字母是否是元音,如果是,请再次检查。
我将if self.values.has_key(key)
循环更改为以下内容:
if self.values.has_key(key):
path = path + key
nextNode = self.values[key]
ret = nextNode.searchWord(word, path)
if ret == None:
# check if key == vowel and replace path
# return nextNode.searchWord(...
return ret
我在这里做错了什么?当回溯以实现我想要做的事情时,我能做什么?