我正在尝试理解以下算法,但我很难做一些事情:
首先输入是什么样的,即Aple或Ap_le和
其次这部分代码是做什么的?
“我们正在增加两种可能性:第一种
字符已被删除,加上第一个字符存在
countWords(vertex, word, missingLetters)
k=firstCharacter(word)
if isEmpty(word)
return vertex.word
else if notExists(edges[k]) and missingLetters=0
return 0
else if notExists(edges[k])
cutLeftmostCharacter(word)
return countWords(vertex, word, missingLetters-1)
Here we cut a character but we don't go lower in the tree
else
We are adding the two possibilities: the first
character has been deleted plus the first character is present
r=countWords(vertex, word, missingLetters-1)
cutLeftmostCharacter(word)
r=r+countWords(edges[k], word, missingLetters)
return r
“
如果通过链接到顶点的所有edegs,第三个不应该是第二个吗?
来源: https://www.topcoder.com/community/data-science/data-science-tutorials/using-tries/
auto.assign=FALSE
答案 0 :(得分:0)
首先:输入是树中的一个顶点(根)一个单词和一些丢失的字母。
例如:countWords(rootNode,“apple”,1)
树本质上是递归的,要理解这些算法,您应该将顶点视为在树的每个后续调用函数的起始位置。
现在我将用普通的psudo-er代码说出这个逻辑的每个部分是做什么的。
countWords(WhereYouAreAt, word, missingLetters)
k = firstCharacter(word) # the first charactor is the next edge to traverse
if(word = ""){Return(WhereYouAreAt.word)}
else if (notExists(edges[k]) and missingLetters=0) {return 0} # Because you arn't at a word and and you can't make a word with the prefix that caused you to arrive at WhereYouAreAt.
else if notExists(edges[k]){
cutLeftmostCharacter(word)
return countWords(vertex, word, missingLetters-1)
#use one of the missing letters on the current letter. continue from WhereYouAre
}
else{
cutLeftmostCharacter(word) #!!!
r=countWords(vertex, word, missingLetters-1)
r=r+countWords(edges[k], word, missingLetters)
return r
}
其次是cutLeftmostCharacter(word)#!!!需要在您询问的行之前,该行计算节点下的单词数量WhereYouAreAt包含单词中剩余的字母减去n个missingLetters。第一行r =计数,如果你跳过单词中的第一个字母,r + =计数,如果你不跳过那个字母。
遗憾的是,由于输出可能会尝试并返回字符串和数字的总和,因此输出更糟糕......为了解决这个问题,我们需要将第一个if语句更改为
if(word = ""){Return(vertex.words)}
而不是vertex.word ...
这样输出应该是字典中包含来自word的给定字母的有序子集的字数。
我希望这会有所帮助。