Amazon OA 真题: Most Often String

842 阅读2分钟

专栏 | 九章算法
网址 | www.jiuzhang.com

学员提问
Amazon OA 真题

在一个长度为N的string中,找到出现次数最多的substring出现的次数。 substring限制如下:

  1. 长度在K和L之间, 2 <= k < L <= 26
  2. substring当中包含的unique的字符个数不超过M个 2 <= M <= 26

Test case

Input:
k = 2
L = 4
M = 26
ababab

Output:
3

Explain:
for size 2 substring, ab repeats 3 times
for size 3 substring, aba repeats 2 times and bab repeats twice
for size 4 substring, no substring repeats

目前只想到Brute Force的做法,因为是求最大repeat次数,考虑用动归,但是状态怎么定义想不到。

九章解答
助教讲解

我想到的解法是这样的,也是暴力,时间复杂度O(N):

考虑到K和L很小。所以一次求解长度为K的最多重复子串,长度为K+1的最多重复子串.......长度为L的最多重复子串。

for len = K to L:
solve(len)

现在求长度为len的最多重复子串。
接下来对字符串内长度len的所有字串进行hash。

s[0, len - 1]的hash值,
s[1, len] 的hash值
......
s[s.length() - len + 1, s.length()]的hash,

这样hash都是数字,只需要统计出重复次数最多的数字即可。这个问题就非常简单了。

快速的计算出这些hash值:
使用Rabin-Karp算法预处理的部分就可以O(N)的的是时间复杂度内求出这些hash值。Rabin-karp算法网上资料很多。

我在这里稍微解释一下:
比如 len = 5

hash0 = s[0] x^4 + s[1] x^3 + s[2] x^2 + s[3] x + s[4] (x 是你设定的一个数)
hash1 = (hash0 - s[0] x^4) x + s[5]
....
hash[i] = (hash[i - 1] - s[i - 1] x^4) x + s[i + 4]

外面循环K to L 也就常数复杂度,计算一次的复杂度是O(N), 总的时间复杂度是O(N)。


推荐阅读:



欢迎关注我的微信公众号:九章算法(ninechapter)。
精英程序员交流社区,定期发布面试题、面试技巧、求职信息等

九章算法,IT教育领域的深耕者
九章算法,IT教育领域的深耕者