最常见的固定长度的子串 - 需要简单的解决方案

时间:2018-03-10 14:05:27

标签: c++ string algorithm

  

请描述(不实施!)算法(可能最快)   它接收n个字母和正整数k的字符串   参数,并打印长度为k的最频繁的子字符串(如果   有多个这样的子串,算法打印其中任何一个)。   字符串由字母" a"组成。和" b"。例如:for string   ababaaaabb和k = 3答案是" aba",发生2次(事实   它们重叠并不重要)。描述一个算法,证明它   正确性并计算其复杂性。

我只能使用C ++的大多数基本功能:没有向量,类,对象等。我也不了解字符串,只知道字符表。有人可以向我解释算法是什么,可能在代码中实现以便于理解吗?这是大学考试的问题,这就是为什么它如此奇怪。

1 个答案:

答案 0 :(得分:0)

一个简单的解决方案是从左到右尝试所有可能的子串(即从索引i=0n-k),并将每个子串与下一个子串进行比较(即从索引{{1}开始)到j=i+1)。

对于每个n-k - 子字符串,您可以计算出现次数,并记录最常用的频率。

作为字符串比较最差k字符比较的费用,您将执行i这样的比较,总费用为(n-k-1)(n-k)/2。 [事实上,成本可能会降低,因为某些字符串比较可能会提前终止,但我无法执行评估。]

这个解决方案很简单,但效率可能不高。

理论上,您可以使用更高效的字符串匹配算法(例如Knuth-Morris-Pratt)来降低成本,从而导致O(k(n-k)²)操作。