[模板]-KMP字符串匹配
2017-09-03 11:49
106 查看
学习资料
严蔚敏:上:http://v.youku.com/v_show/id_XODYxNjExODQ=.html(开始于第 34分钟)
下:http://www.56.com/u28/v_NjAwMzA0ODA.html
《大话数据结构》
代码
char s[1000010],t[1010];//s是主串,t是模式串 int NEXT[1010],lens,lent;//next数组,直接写next会CE,可以先写成next提交时用替换换成不会CE的形式 void GetNext()//求解NEXT数组其实就是一个模式串自我匹配的过程 { NEXT[1] = 0;//初始化(根据next函数的定义) int j = 0; for(int i = 2; i <= lent; ++i)//不能从1开始,防止前缀=后缀=整个串的情况 { while(j > 0 && t[i] != t[j + 1])//如果不相等且还能向前跳的话,就跳(注意j > 0要写在前面) j = NEXT[j];//向前跳 if(t[i] == t[j + 1])//如果相等,j++匹配下一个字符 j++; NEXT[i] = j;//记录 } } void KMP(char s[],char t[])//主串s,模式串t,求解思路同上 { GetNext();//求解next数组 int j = 0; for(int i = 1; i <= lens; ++i)//i从1开始 { while(j > 0 && s[i] != t[j + 1])//如果不相等且还能向前跳的话,就跳 j = NEXT[j]; if(s[i] == t[j + 1])//相等就j++ j++; if(j == lent)//如果匹配成功 printf("%d\n", i - lent + 1);//输出匹配成功的位置 } } int main() { scanf("\n%s\n%s",s + 1,t + 1);//下标从1开始!很巧妙 lens = strlen(s + 1);//主串长度 lent = strlen(t + 1);//模式串长度 KMP(s,t);//调用 for(int i = 1; i <= lent; ++i)//输出NEXT数组 printf("%d ",NEXT[i]); printf("\n"); return 0; }
解决方法
根据自己的需求,灵活地套用模板相关文章推荐
- [洛谷P3375] 【模板】KMP字符串匹配
- P3375 【模板】KMP字符串匹配 (KMP模板)
- 洛谷P3375 【模板】KMP字符串匹配
- 【KMP】KMP算法模板
- 扩展KMP模板
- KMP 算法模板
- 【模板】KMP字符串匹配
- kmp模板 hdu1711
- poj3461 KMP模板题
- POJ - 3461 Oulipo(KMP模板题)
- KMP模板1(便于理解)(poj3461)
- 【KMP】【模板】
- KMP 模板
- KMP 模板 next数组
- HDOJ1711 KMP模板程序
- POJ 3461 Oulipo(KMP模板题)
- KMP模板(2203)
- KMP模板
- KMP&&manacher模板题
- LeetCode-28-Implement strStr() KMP模板题