标签:isp width ++ 位置 pre 字符 idt 最长前缀 closed
KMP:一种模式匹配算法
重点:next数组:长度就是模式子串的长度
next[i]的值是若第i个位置不匹配则下一个要进行匹配的首地址
重点理解前缀后缀:例如:abcabc的最长前缀abc,后缀abc,
aaaa的前缀是aaa(aaaa就没有意义了)后缀是aaa.
分析:j值回溯:j返回到前一个失配的适配值
代码记住就好,感觉就是恰好就是这样,理解起来好难!!
1 #include <stdio.h> 2 typedef char *String; 3 void get_next(String T,int *next) 4 { 5 int i = 1; 6 int j = 0; 7 next[1] = 0; 8 while(i<T[0]) 9 { 10 if(j==0 || T[i]==T[j]) 11 { 12 i++; 13 j++; 14 //next[i] = j; 15 //改进的KMP的next数组 16 if(T[i]!=T[j]) //若当前字符与前缀字符不同 17 next[i] = j; 18 else 19 next[i] = next[j]; 20 } 21 else 22 { 23 j = next[j]; 24 } 25 } 26 } 27 28 //返回子串T在主串S的第pos个字符之后的位置 29 //若不存在,则返回0 30 int index_KMP(String S,String T,int pos) 31 { 32 int i = pos; 33 int j = 1; 34 int next[255]; 35 36 get_next(S, next); 37 while(i<=S[0] && j<=T[0]) 38 { 39 //容易丢掉j==0,因为后面next[j]可能=0 40 if(j==0 || S[i]==T[j]) 41 { 42 i++; 43 j++; 44 } 45 else 46 { 47 j = next[j]; 48 } 49 } 50 if(j>T[0]) 51 { 52 return i - T[0]; 53 } 54 else 55 return 0; 56 } 57 58 int main() 59 { 60 char str[255] = " ababab"; 61 int next[255]; 62 63 str[0] = 6; 64 get_next(str, next); 65 66 for (int i = 1; i < 7;i++) 67 printf("%d ", next[i]); 68 }
标签:isp width ++ 位置 pre 字符 idt 最长前缀 closed
原文地址:https://www.cnblogs.com/wuweixiong/p/13586031.html