Algorithm 查找子字符串最大出现次数的算法

Algorithm 查找子字符串最大出现次数的算法,algorithm,Algorithm,给定一个字符串S,找到重复次数最多的子字符串的最佳算法是什么 例如,在“assdssfsd”中,重复次数最多的是“ss”。我可以看到构建一棵树来解决这个特定问题 有一个概念上的根节点。第一个角色是第一个子角色。第二个字符是案例中第一个字符a->s的子字符。它还开始根节点的新叶。如果在添加节点时访问现有节点,则增加其计数(初始值1) 完成后,您将访问树的每个节点,以查找最深级别上计数最高的节点(因为如果“asdf”出现5次,那么根据定义,“a”、“as”和“asd”至少出现5次)。我可以看到构建树

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


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

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

有一个概念上的根节点。第一个角色是第一个子角色。第二个字符是案例中第一个字符a->s的子字符。它还开始根节点的新叶。如果在添加节点时访问现有节点,则增加其计数(初始值1)


完成后,您将访问树的每个节点,以查找最深级别上计数最高的节点(因为如果“asdf”出现5次,那么根据定义,“a”、“as”和“asd”至少出现5次)。

我可以看到构建树来解决该特定问题

有一个概念上的根节点。第一个角色是第一个子角色。第二个字符是案例中第一个字符a->s的子字符。它还开始根节点的新叶。如果在添加节点时访问现有节点,则增加其计数(初始值1)


完成后,您将访问树的每个节点,以查找最深级别上计数最高的节点(因为根据定义,如果“asdf”出现5次,那么“a”、“as”和“asd”至少出现5次)。

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

>>> 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')]

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

>>> 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,在O(n)中找到最常出现的非空子字符串之一,由读者证明!
int[]x=新int[65536];
foreach(myString中的字符c)
x[(int)c]++;
int max=0;
对于(int i=0;i
不过,这可能不是你想要的。你可能需要看看哈夫曼编码之类的东西……

/C#code,在O(n)中找到一个最常见的非空子字符串,读者证明!
int[]x=新int[65536];
foreach(myString中的字符c)
x[(int)c]++;
int max=0;
对于(int i=0;i

不过,这可能不是你想要的。你可能需要看看哈夫曼编码之类的东西。

听起来你在寻找类似压缩算法的东西。压缩的工作原理是查找冗余(重复)信息,并将其替换为指向第一次出现的指针。下面是一些这样做的代码示例:


听起来像是在寻找接近压缩算法的东西。压缩的工作原理是查找冗余(重复)信息,并将其替换为指向第一次出现的指针。下面是一些这样做的代码示例:

在长度为“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

如果您对每个字符进行相同大小的桶放置(而不是排序),则

   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与1的Bucket进行比较

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

最后,放置桶后,取编号最高的桶作为答案。

以“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

如果您对每个字符进行相同大小的桶放置(而不是排序),则

   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与1的Bucket进行比较

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



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

实际上,重复最多的子串是“s”。(如果你想挑剔的话,“”会更频繁地重复。)假设你想要长度为2的子字符串,那么重叠呢?DDSSSDD的解决方案是什么?dd=2,ss=3?重叠部分是一个很好的点。同样值得澄清的是,在不同长度的子串中,哪一个最常见。您是否在寻找重复次数最多的最长子串?实际上,重复次数最多的子串是“s”。(如果你想挑剔的话,“”会更频繁地重复。)假设你想要长度为2的子字符串,那么重叠呢?DDSSSDD的解决方案是什么?dd=2,ss=3?重叠部分是一个很好的点。同样值得澄清的是,对于长度不同的子字符串,哪一个最常见。您是否在寻找重复次数最多的最长子字符串?不要忘记空字符串!:)这取决于问题的定义。在“asasd”的情况下,最常见的子字符串是什么?“a”、“s”或“as”?在平局的情况下,我会说它是最长的子字符串,否则问题就很简单,就像你说的,除非你需要找到所有相等的子字符串。@Bombe:我假设空子字符串被忽略了,因为它在任何字符串中都会无限多次出现。=)@克莱特斯:请注意,一个较长的子串不会比一个较短的子串出现得更多,所以一个较短的答案(子串)也同样好。当然,如果需要列出所有正确的答案,情况就会发生变化。@CanBerk:问题还需要澄清,是“任何”、“所有”还是“最长”最频繁的子项