查找String是否可以是另一个字符串中的子序列

时间:2015-11-09 19:16:21

标签: algorithm language-agnostic dynamic-programming

这个问题是我在最近的编码竞赛中被问到的最长公共子序列的变体。它不是要找到最长的公共子序列。

考虑更大的字符串s1 = abaabbabcacc和更小的字符串s2 = abc。字符串的功能定义为该字符串的每个字符的重复。所以:

  • s2 to power 1是“abc”
  • s2 to power 2是“aabbcc”
  • s3 to power 3是“aaabbbcc”等。

现在提出的问题如下:我们如何找到字符串 s2 的最大功率,使其成为 s1 中的有效子序列。所以在这种情况下,答案是3,因为:

s2 to power 3 = "aaabbbccc"
s1 = "(a)b(aabb)a(bc)a(cc)"

蛮力算法似乎很简单:你启动哪个功率1并检查s2到功率1是否是s1的子序列。重复直到最大功率k,以获得O(kn)的时间复杂度。

更好的方法是首先找到可能的最大功率k,然后进行二进制搜索以找到所需的输出。这将在O(n * log(k))中起作用。所以我想知道是否有任何方法可以做到这一点是O(n)。

我们可以假设没有内存限制。

0 个答案:

没有答案