专栏 | 九章算法
网址 | www.jiuzhang.com
学员提问
Amazon OA 真题
在一个长度为N的string中,找到出现次数最多的substring出现的次数。 substring限制如下:
- 长度在K和L之间, 2 <= k < L <= 26
- 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)。
推荐阅读:
- 网申时, 是否需要 cover letter (求职信) ?
- 2017年最受欢迎的编程语言有哪些?
- HR 揭秘: 10 个挂掉 Offer 的原因
- Google offer 如何谈判?听听 Google recruiter 怎么说!
- 面试遇到做过的题怎么办?
- Snapchat 面经 | LA 总部面试体验
- 面试前如何了解一家IT企业?试试官方技术博客!
- 互联网历史上最有创意的 7 份简历
- 利用 Twitter 找工作 | 如何寻找招聘信息
- Facebook 电面+Onsite面经
欢迎关注我的微信公众号:九章算法(ninechapter)。
精英程序员交流社区,定期发布面试题、面试技巧、求职信息等
