标签:
char str[1000010],pat[1000010];//pat为模式串,str为主串 int Next[1000010]; //Next[x]下标x表示匹配失败处字符下标 //模式串pat的前缀与x位置的后缀的最大匹配字符个数-1 void GetNext(char *pat) { int LenPat = strlen(pat); int i = 0,j = -1; Next[0] = -1; while(i < LenPat) { if(j == -1 || pat[i] == pat[j]) { i++,j++; Next[i] = j; } else j = Next[j]; } } int KMP()//返回模式串pat在str中第一次出现的位置 { int LenStr = strlen(str); int LenPat = strlen(pat); GetNext(pat); int i = 0,j = 0; int ans = 0; while(i < LenStr) { if(j == -1 || str[i] == pat[j]) i++,j++; else j = Next[j]; if(j == LenPat) { return i - LenStr + 1; } } return ans; }
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/45340205