高效所有子字符串按排序顺序计数

时间:2015-06-09 19:24:08

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

根据频率,你会得到一个字符串,找到所有子字符串排序的频率(递减顺序)。

例如: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 a 2 b 2 ba 2 aba 2 ab 1 abab 1巴巴 1 ababa 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

1 个答案:

答案 0 :(得分:1)

可以通过这种方式实现O(n ^ 2)解决方案:

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

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