字符串'hello',如何列出所有单词和每个单词的计数。 普通后缀树算法仅返回后缀,表示中间单词“ll”不会出现。谁能帮助我一步一步解决?
答案 0 :(得分:1)
初始化哈希表 使用双循环(for for for)。一个循环索引将表示子字符串的开头,另一个循环索引表示结束。确保结束索引严格大于起始索引,并且两者都在字符串边界内 对于遇到的每个子字符串,检查它是否在哈希中。如果不是 - 将其添加为键,值为1.如果是 - 增加当前保存的值。
根据您的评论修改:
for(b = 0; b < len; ++b) {
for(e = b + 1; e <= len; ++e) {
//process substring from index b (incl.) to index e (excl.)
}
}
这将按此顺序遍历字符串“abcd”:
a ab abc abcd b bc bcd c cd d
答案 1 :(得分:0)
使用前缀树而不是后缀树。然后运行这个树,并在任何节点输出到目前为止遇到的字符串加上仍然可用的子树数。
修改强>
实际上现在太早了,我搞砸了一些术语:
前缀树是仅存储公共前缀一次的树。后缀树将所有后缀存储在前缀树中。所以我在这里指的是一个后缀树(它也恰好是一种特殊的前缀树)。
所以你要做到以下几点:
从前缀
开始搜索前缀树function search( node ) {
c = node.symbol;
if not children.empty then
for each child in node.children do
sub_search = search( child )
other_results.append( sub_search.results );
sub_trees += sub_search.num_trees
done
for each result in other_results do
append c to result
done
return c :: other_results
else
return {results = c; num_trees = 1 }
fi
}
如果我没有犯任何错误,这应该可以解决问题。后缀树的后缀部分负责消除所有后缀,前缀部分负责消除所有前缀。因为两者都存储得很少,所以你可以在它们之间获得字符串(可能已经存储在一起)。请注意,这不包括对trie的任何压缩,除非你的字符串变得很长,否则通常不需要压缩。