【问题标题】:Efficient All substring counting in sorted order高效的所有子字符串按排序顺序计数
【发布时间】:2015-06-09 19:24:08
【问题描述】:

给你一个字符串,根据那里的频率找到所有子字符串排序(降序)的频率。

例如:ababa {“a”、“b”、“a”、“b”、“a”、“ab”、“ba”、“ab”、“ba”、“aba”、“bab”、“aba”、“ abab", "baba", "ababa"}.

输出:

3,2,2,2,2,1,1,1,1

解释

3 一个 2 乙 2巴 2阿巴 2抗体 1 个 1个爸爸 1 贝巴 1个宝宝

解决方案

1)一个明显的解决方案是将所有字符串保存在哈希映射中并对其进行计数 频率,但需要 o(n^3logn) O(n^2 *n){n^2 个子串 *O(n) 用于比较字符串 *logn(因为地图维护为红黑树)} 2)在三叉搜索树中插入所有子串,然后检索每个子串的频率,然后对频率进行排序 O(n^3 logn)

我想知道是否存在 O(n^2) 或 O(nlogn) 解决方案。

喜欢这个http://www.quora.com/Given-a-string-how-do-I-find-the-number-of-distinct-substrings-of-the-string

【问题讨论】:

标签: java string algorithm suffix-tree suffix-array


【解决方案1】:

这样可以得到一个 O(n^2) 的解:

  1. 将所有子字符串插入到 trie 中。这可以在 O(n^2) 内完成。

  2. 获取所有频率并对它们进行排序。 请注意,任何子字符串的频率只能在 [0, n] 范围内,因此桶排序可以使所有数字按 O(n^2) 排序,因为在最坏的情况下会有 n^2 个数字。

【讨论】:

  • 有 O(n^2) 个子串,大小为 O(n)。将它们插入到 trie 是 O(n^3)。
  • 但是子字符串是增量的。所以对于 "abc",插入 "a" "ab" "abc" 只需要对 trie 进行 3 次操作,而不是 1+2+3
  • 那么它不是“将 O(n^2) 子字符串插入到 trie 中”,如果你想使用它们是增量的事实,那就是另外一回事了。我并不是说它不能完成,我声称它不是黑盒插入 O(n^2) 子字符串。
猜你喜欢
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多