Open Alice52 opened 1 year ago
concept
比如 abc 的前缀有 a | ab
比如 abc 的前缀有 c | bc
overview
next 数组求解: aabaabaabaaf => aabaabaaf
aabaabaabaaf
aabaabaaf
j=j+1
j循环回退到j-1的位置
void getNext (int* next, const string& s){ next[0] = 0; int j = 0; for(int i = 1;i < s.size(); i++){ while(j > 0 && s[i] != s[j]) { j = next[j - 1]; } if(s[i] == s[j]) { j++; } next[i] = j; } }
kmp flow: while(i<m&&j<n)
while(i<m&&j<n)
full code
void search(char text[], char p[]){ int n=strlen(p); int *prefix=(int *)malloc(sizeof(int)*n); // 1. prefix_table(p,prefix,n); // 2. move_prefix_table(prefix,n); int m=strlen(text); int i,j; // 3. while(i<m&&j<n){ if(j==-1 || text[i]==p[j]){ i++; j++; } else j=prefix[j]; } return j>n; }
kmp
concept
比如 abc 的前缀有 a | ab
比如 abc 的前缀有 c | bc
overview
next 数组求解:
aabaabaabaaf
=>aabaabaaf
j=j+1
j循环回退到j-1的位置
kmp flow:
while(i<m&&j<n)
full code