字符串处理

时间:2011-09-20 03:49:14

标签: string algorithm tree

字符串'hello',如何列出所有单词和每个单词的计数。 普通后缀树算法仅返回后缀,表示中间单词“ll”不会出现。谁能帮助我一步一步解决?

2 个答案:

答案 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)

使用前缀树而不是后缀树。然后运行这个树,并在任何节点输出到目前为止遇到的字符串加上仍然可用的子树数。

修改

实际上现在太早了,我搞砸了一些术语:

前缀树是仅存储公共前缀一次的树。后缀树将所有后缀存储在前缀树中。所以我在这里指的是一个后缀树(它也恰好是一种特殊的前缀树)。

所以你要做到以下几点:

  1. 构建后缀树
  2. 从前缀

    开始搜索前缀树
    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的任何压缩,除非你的字符串变得很长,否则通常不需要压缩。