大三了终于开始刷LeetCode了,按照这篇刷题指南进行分模块刷题,这次是KMP算法。
把计算next表的固定模板记录在此,这是直接使用前缀表,不减一的方式。
void getNext(int* next,const string&s){
int j=0;
next[j]=0;
for(int i=1;i<s.size();i++){
while(j>0&&s[j]!=s[i]){
j=next[j-1];
}
if(s[i]==s[j]) j++;
next[i]=j;
}
}
还有一种是将next表减一的方式
void getNext(int* next,string &s ){
int j=-1;
next[0]=j;
for(int i=1;i<s.size();i++){
while(j>=0&&s[i]!=s[j+1]) j=next[j];
if(s[i]==s[j+1]) j++;
next[i]=j;
}
}
LeetCode 28.实现strStr()
class Solution {
public:
void getNext(int* next,const string&s){
int j=0;
next[j]=0;
for(int i=1;i<s.size();i++){
while(j>0&&s[j]!=s[i]){
j=next[j-1];
}
if(s[i]==s[j]) j++;
next[i]=j;
}
}
int strStr(string haystack, string needle) {
if(needle.size()==0){
return 0;
}
int next[needle.size()];
getNext(next,needle);
int j=0;
for(int i=0;i<haystack.size();i++){
while(j>0&&haystack[i]!=needle[j]){
j=next[j-1];
}
if(haystack[i]==needle[j]) j++;
if(j==needle.size()) return (i-needle.size()+1);
}
return -1;
}
};
LeetCode 459.重复的字符串
class Solution {
public:
void getNext(int* next,string &s ){
int j=-1;
next[0]=j;
for(int i=1;i<s.size();i++){
while(j>=0&&s[i]!=s[j+1]) j=next[j];
if(s[i]==s[j+1]) j++;
next[i]=j;
}
}
bool repeatedSubstringPattern(string s) {
if(s.size()==0) return false;
int next[s.size()];
getNext(next,s);
int len=s.size();
if(next[len-1]!=-1&&len%(len-1-next[len-1])==0) return true;
return false;
}
};