找到子串最大出现的算法

时间:2008-12-18 14:04:02

标签: algorithm

给定一个字符串S,找到一个重复最多次数的子字符串的最佳算法是什么。

例如,在“assdssfssd”中,重复最多次数的是“ss”。

5 个答案:

答案 0 :(得分:2)

我可以看到构建一棵树来解决这个特定的问题。

有一个名义上的根节点。第一个角色是第一个孩子。第二个角色是第一个角色的孩子a - >在你的情况下。它也开始了根节点的新叶子。如果在添加节点时访问现有节点,则增加其计数(初始值1)。

完成后,您访问树的每个节点,找到最深层次计数最高的那个节点(因为如果“asdf”出现5次,那么“a”,“as”和“asd”出现的最小值根据定义,5次。

答案 1 :(得分:1)

重复最多的子字符串将是一个字母,因此您将找到最多出现的字母。这很简单:

>>> str = 'Can Berk Güder'
>>> letters = [l for l in str]
>>> uniq_letters = set(letters)
>>> counts = [(letters.count(l), l) for l in uniq_letters]
>>> counts
[(1, 'B'), (1, 'C'), (1, 'G'), (1, 'a'), (1, 'd'), (1, 'k'), (1, 'n'), (1, 'ü'), (2, ' '), (2, 'e'), (2, 'r')]

答案 2 :(得分:1)

听起来你正在寻找接近压缩算法的东西。压缩通过查找冗余(重复)信息并将其替换为指向第一个匹配项的指针来工作。以下是一些代码示例:

http://www.developerfusion.com/code/1642/string-compression/

http://www.howtodothings.com/computers/a1223-simple-string-compression.html

答案 3 :(得分:0)

// C# code, finds one of the most occurred non-empty substrings in O(n), proof by the reader!
int[] x = new int[65536];
foreach (char c in myString)
     x[(int)c]++;
int max = 0;
for (int i = 0; i < x.Length; ++i)
    if (x[max] < x[i])
        max = i;
return ((char)max).ToString();

但这可能不是你想要的。您可能需要查看类似哈夫曼编码的内容......

答案 4 :(得分:0)

在“N”长度的弦乐中,

   No Of "1" character will be "N" which requires comparision of N * (N-1) / 2

   No of "2" characters will be "N-1" which requires comparision of (N-1) * (N-2) / 2


   No of "3" characters will be "N-2"  which requires comparision of (N-2) * (N-3) / 2

.............

和“N”字符的数量将为“1”,这需要(1 * 0/2)的比较

因此没有最大子串=“N”+“N-1”+ ....“1”=(N *(N + 1)/ 2)并且所需的比较是(N + 1)*(N )*(N-1)/ 6

如果您在每个字符数量相同的情况下执行Bucket放置(不排序),则

   No Of "1" character will be "N" which requires comparision of N -1 with buckets of N

   No of "2" characters will be "N-1" which requires comparision of (N-2) with Buckets of N-1

   No of "3" characters will be "N-2"  which requires comparision of (N-3) with Buckets of N-2

.............

和“N”字符的数量将为“1”,这需要0与Bucket为1的compariosn

这里它将总比较减少到“N *(N-1)/ 2”

最后,在放置水桶后,取出最高位数的水桶作为答案。