这个问题是我在最近的编码竞赛中被问到的最长公共子序列的变体。它不是要找到最长的公共子序列。
考虑更大的字符串s1 = abaabbabcacc
和更小的字符串s2 = abc
。字符串的功能定义为该字符串的每个字符的重复。所以:
现在提出的问题如下:我们如何找到字符串 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)。
我们可以假设没有内存限制。