【问题标题】:Most frequent substring of fixed length - simple solution needed [closed]最常见的固定长度子串 - 需要简单的解决方案[关闭]
【发布时间】:2018-03-10 14:05:27
【问题描述】:

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

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

【问题讨论】:

  • 不清楚你是如何从那个描述中得到你所指的 C++ 或这个神秘的 C/C++(不存在)的。
  • @UlrichEckhardt:早期的 C++ 实现是通过宏在 C 代码中构建的。
  • 这与历史相关,@YvesDaoust,但即使在 20 年前,您已经拥有原生 C++ 编译器。而且,C/C++ 的确切含义是什么?恕我直言,这只是由不了解这是两种不同编程语言的人所做的。
  • @UlrichEckhardt:我相信这个问题可以通过在 C 和 C++ 编译器下都可以工作的代码来解决。
  • 对不起,我不知道这样写不好,我所有的教授都这样写。它指的是 C 或 C++,因为假设在本课程中我们的程序非常简单,它们在两种语言中基本上几乎相同(因为我们不允许使用 C++ 之类的对象的更高级功能)。

标签: c++ string algorithm


【解决方案1】:

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

对于每个i-substring,您计算出现次数,并跟踪迄今为止最频繁出现的次数。

作为字符串比较,在最坏的 k 个字符比较中,您将执行(n-k-1)(n-k)/2 这样的比较,总成本为O(k(n-k)²)。 [实际上成本可以更低,因为某些字符串比较可能会提前终止,但我无法执行评估。]

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

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

【讨论】:

  • 非常感谢!这是第一个有用的答案,这就是我所需要的。
猜你喜欢
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 2010-12-08
相关资源
最近更新 更多