给定一个字符串S,找到一个重复最多次数的子字符串的最佳算法是什么。
例如,在“assdssfssd”中,重复最多次数的是“ss”。
答案 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”
最后,在放置水桶后,取出最高位数的水桶作为答案。