字符串哈希.Ranbin-karp

187. Repeated DNA Sequences
The DNA sequence is composed of a series of nucleotides abbreviated as ‘A’, ‘C’, ‘G’, and ‘T’.

For example, “ACGAATTCCG” is a DNA sequence.
When studying DNA, it is useful to identify repeated sequences within the DNA.

Given a string s that represents a DNA sequence, return all the 10-letter-long sequences (substrings) that occur more than once in a DNA molecule. You may return the answer in any order.

题目要求找出满足目标子串的长度为1010,且在 DNA 字符串s中出现次数超过一次的所有子串。

遍历字符串,统计所有长度为1010的子串的出现次数,这里需要解决两个问题。

第一个问题,如何截取长度为10的子串。可以借助 substrsubstr函数,或者自己实现一个函数,维护一个长度为10的子串,每次删除最前面第一个字符,从最后面增加一个字符。
第二个问题,如何统计截取长度为10的子串的出现次数。可以借助哈希表,实现O(1)O(1)的插入和删除。
最后,遍历哈希表中的元素,统计出现次数超过一次的数量即可。

优化点在第二点。
如何统计截取长度为10的子串的出现次数。每次循环构造子字符串的复杂度都是O(L),总复杂度在O(NL)。
注意到字符串只会出现四种字符,2-bit就可以表示。子字符串长度为10,因此20bit就可以表示整个子字符串。因此一个int就足够了。这样将每次循环的子字符串转int就很容易了。但是如果每次都一个字符一个字符的转int,那么复杂度还是O(NL),联想到循环中前后两次的字符串实际就相差一个字符,即前一个substr的第一个字符删除,后一个substr添加新字符。而这一点很容易用位运算表示,这样就可以通过这种滑动窗口的形式以O(1)的复杂度得到当前substr的int。

1044. 最长重复子串
给你一个字符串 s ,考虑其所有 重复子串 :即,s 的连续子串,在 s 中出现 2 次或更多次。这些出现之间可能存在重叠。
返回 任意一个 可能具有最长长度的重复子串。如果 s 不含重复子串,那么答案为 “” 。

rabin-karp + 二分

猜你喜欢

转载自blog.csdn.net/weixin_45719581/article/details/120649568