English 中文(简体)
查找子字符串最大出现次数的算法
原标题:
  • 时间:2008-12-18 14:04:01
  •  标签:

给定一个字符串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”

最后,在完成放置水桶后,选择编号最高的水桶作为答案。





相关问题
热门标签