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

Most frequent substring of fixed length - simple solution needed

本文关键字:解决方案 简单 字符串 常见      更新时间:2023-10-16

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

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

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

对于每个i -子字符串,您计算出现次数,并跟踪到目前为止最频繁的出现次数。

作为字符串比较,最坏的成本是k字符比较,您将执行(n-k-1)(n-k)/2此类比较,总成本为O(k(n-k)²)顺序。[事实上,成本可以更低,因为某些字符串比较可能会提前终止,但我无法执行评估。

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

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