串的模式匹配问题
有三种方法
1、直接匹配 2、首尾匹配 3、KMP算法
(1) 前两种算法时间复杂度为O(M*N);后一种为O(m+n)
(2)算法1实际执行时间近似O(m+n),KMP算法只有模式串与主串之间有很多部分匹配的情况下才显得高效。
但是KMP算法的优点在于主串指针不回溯,对处理从外设输入的庞大数据文件很有效,可以边读入边匹配,无需回头重读。
1、直接匹配法
int index(SString S, SString T, int pos) { i=pos; j=1; while(i<=S[0]||j<=T[0]) { if(S[i]==T[j]) {i++; j++;} else {i=i-j+2; j=1;} } if(j>T[0]) return i-j+1; else return 0; } //注:此处T[0]意为字符串T的长度,实际数据从T[1]开始
2、首尾匹配
int index(SString S, SString T, int pos) { sLength=S[0]; tLength=T[0]; i=pos; while(i<=sLength-tLength+1) { if(S[i]!=S[1]) ++i; else if(S[i+tLength-1]!=T[tLength]) ++i; else { k=1;j=2; while(j<tLength&&S[k+i]==T[j]) {++k;++j} if(j==tLength) return i; else ++i; } } return 0; } //注:此处T[0]意为字符串T的长度,实际数据从T[1]开始
3、KMP算法
int index(SString S, SString T, int pos) { i=pos; j=1; while(i<=S[0]||j<=T[0]) { if(S[i]==T[j]) {i++; j++;} else j = next[j]; } if(j>T[0]) return i-j+1; else return 0; } void get_next(SString T, int next[]) { i=1; next[1]=0; j=0; while(i<T[0]) { if(j==0||T[i]==T[j]) { ++i; ++j; if(T[i]==T[j]) next[i]=next[j]; else next[i] = j; } else j=next[j]; } } //注:此处T[0]意为字符串T的长度,实际数据从T[1]开始