请描述(不实施!)算法(可能最快) 它接收n个字母和正整数k的字符串 参数,并打印长度为k的最频繁的子字符串(如果 有多个这样的子串,算法打印其中任何一个)。 字符串由字母" a"组成。和" b"。例如:for string ababaaaabb和k = 3答案是" aba",发生2次(事实 它们重叠并不重要)。描述一个算法,证明它 正确性并计算其复杂性。
我只能使用C ++的大多数基本功能:没有向量,类,对象等。我也不了解字符串,只知道字符表。有人可以向我解释算法是什么,可能在代码中实现以便于理解吗?这是大学考试的问题,这就是为什么它如此奇怪。
答案 0 :(得分:0)
一个简单的解决方案是从左到右尝试所有可能的子串(即从索引i=0
到n-k
),并将每个子串与下一个子串进行比较(即从索引{{1}开始)到j=i+1
)。
对于每个n-k
- 子字符串,您可以计算出现次数,并记录最常用的频率。
作为字符串比较最差k字符比较的费用,您将执行i
这样的比较,总费用为(n-k-1)(n-k)/2
。 [事实上,成本可能会降低,因为某些字符串比较可能会提前终止,但我无法执行评估。]
这个解决方案很简单,但效率可能不高。
理论上,您可以使用更高效的字符串匹配算法(例如Knuth-Morris-Pratt)来降低成本,从而导致O(k(n-k)²)
操作。