给定一个字符串S,最佳算法是什么,可以找到重复出现最多次的子串。
例如,在“assdssfssd”中,“ss”重复次数最多。
给定一个字符串S,最佳算法是什么,可以找到重复出现最多次的子串。
例如,在“assdssfssd”中,“ss”重复次数最多。
我可以看到建立一棵树来解决那个特定的问题。
有一个虚根节点。第一个字符是第一个子节点。第二个字符是第一个字符的子节点a -> s。它还开始了根节点的新叶子。如果在添加节点时访问现有节点,则增加其计数(初始值为1)。
一旦完成后,您将访问树的每个节点,以找到最深层次上具有最高计数的节点(因为如果“asdf”出现5次,则“a”、“as”和“asd”最少出现5次,根据定义)。
听起来,你可能在寻找一种接近压缩算法的东西。压缩通过查找冗余(重复的)信息,并用指向第一次出现的指针替换它来工作。以下是一些样例代码:
将此翻译成中文:http://www.developerfusion.com/code/1642/string-compression/ http://www.developerfusion.com/code/1642/string-compression/
将此翻译成中文:http://www.howtodothings.com/computers/a1223-simple-string-compression.html
重复最多的子字符串将是单个字母,因此您将找到出现最多的字母。 这很容易:
>>> 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 )]
// 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();
尽管如此,这可能不是你想要的。你可能需要看一些类似霍夫曼编码的东西...
在一個長度為“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
Sorry, there is nothing to translate. Please provide a phrase or sentence to be translated.
并且“N”个字符中将有“1”个字符需要比较(1 * 0 / 2)。
因此,最大子字符串数量=“N”+“N-1”+....“1”=(N *(N + 1)/ 2),所需比较的数量为(N + 1)*(N)*(N-1)/ 6。
如果你在每个字符数量上进行水桶放置(不是排序),使它们大小相同,那么
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
Sorry, there is nothing to translate. Please provide a phrase or sentence to be translated.
"并且"的字符数量将是"1",需要将0与"1"的桶进行比较。
这将把总比较次数减少到“N * (N-1) / 2”
最后,在完成放置水桶后,选择编号最高的水桶作为答案。