字符串匹配可以用KMP算法来做,但是KMP实在是太恶心了,对子字符串进行哈希找出子字符串,可以用哈希+滑动窗口的方法但每次求一个子字符串的哈希的复杂度都是O(N),比较慢。我们可以利用JDK对字符串的哈希原理,也就是KR算法,模板和介绍如下。
187. 重复的DNA序列
#define ull unsigned long long
class Solution {
public:
string get(string &str, int len){
int n = str.size();
ull P = 131313;
vector<ull> h(n+1, 0);
vector<ull> p(n+1, 1);
for(int i=1; i<=n; i++){
h[i] = h[i-1]*P + (ull)(str[i-1]-'a');
p[i] = p[i-1]*P;
}
unordered_set<ull> s;
for(int i=1; i+len-1<=n; i++){
int j = i+len-1;
ull hash = h[j] - h[i-1]*p[j-i+1];
if(s.find(hash)!=s.end()) return str.substr(i-1, j-i+1);
s.insert(hash);
}
return "";
}
};