串的匹配模式(KMP算法)
//串的模式匹配 //1.朴素的模式匹配算法 int Index1(char S[], char P[], int pos) {//查找并返回串P在主串S中从pos位置开始的位置,否则返回-1 int i, j, slen, plen; i = pos; j = 0; slen = strlen(S); plen = strlen(P); while (i < slen && j < plen) { if (S[i] == P[j]){ ++i; ++j; } else{ i = i - j + 1;//主串位置回退 j = 0; } } if (j == plen) return i - plen; return -1; } //2.改进的模式匹配算法(KMP算法) void GetNext(char p[], int next[]) { int i, j, len; i = 0; j = -1; len = strlen(p); next[0] = -1; while (i < len) { if (-1 == j || p[i] == p[j]) { ++i; ++j; next[i] = j; } else { j = next[j]; } } } int Index_KMP(char S[], char P[], int pos, int next[]) { int i, j, slen, plen; i = pos; j = 0; slen = strlen(S); plen = strlen(P); while (i < slen && j < plen) { if (-1 == j || S[i] == P[j]) { ++i; ++j; } else { j = next[j]; } } if (j == plen) return i - plen; return -1; } void main() { char* s = "ababcdsfds"; char* p = "abab"; int d = Index1(s, p, 0); const int len = strlen(s); int next[5]; GetNext(p, next); int d2 = Index_KMP(s, p, 0, next); printf("%d\n%d", d,d2); }
**
常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。
昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。