Java 按排序顺序对所有子串进行有效计数
您将获得一个字符串,用于查找根据频率排序(降序)的所有子字符串的频率 例如:亚贝巴 {“a”、“b”、“a”、“b”、“a”、“ab”、“ba”、“ab”、“ba”、“aba”、“bab”、“aba”、“aba”、“abab”、“baba”、“abab”、“baba”、“ababa”} 输出: 3,2,2,2,1,1,1,1,1,1 解释 3A 2 b 2 ba 2 aba 2 ab 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)溶液 像这样O(n^2)解决方案可以通过以下方式实现:Java 按排序顺序对所有子串进行有效计数,java,string,algorithm,suffix-tree,suffix-array,Java,String,Algorithm,Suffix Tree,Suffix Array,您将获得一个字符串,用于查找根据频率排序(降序)的所有子字符串的频率 例如:亚贝巴 {“a”、“b”、“a”、“b”、“a”、“ab”、“ba”、“ab”、“ba”、“aba”、“bab”、“aba”、“aba”、“abab”、“baba”、“abab”、“baba”、“ababa”} 输出: 3,2,2,2,1,1,1,1,1,1 解释 3A 2 b 2 ba 2 aba 2 ab 1阿巴布 1巴巴 1亚的斯亚贝巴 1巴布 解决方案 1) 一个显而易见的解决方案是将所有字符串保留在哈希映射中并
有O(n^2)个子字符串,大小为O(n)。将它们插入到trie是O(n^3),但子字符串是递增的。因此,对于“abc”,插入“a”“ab”“abc”只需要对一个trie执行3次操作,而不是1+2+3如果不是“向一个trie插入O(n^2)子字符串”,那么如果您想使用它们是增量的这一事实,则是另一回事。我并不是说它不能完成,我是说它不是黑盒插入O(n^2)子字符串。可能是