kmp匹配
来源:互联网 发布:淄博seo推广公司 编辑:程序博客网 时间:2024/06/06 01:13
KMP简单应用
Time Limit: 1000MS Memory limit: 65536K
题目描述
给定两个字符串string1和string2,判断string2是否为string1的子串。
输入
输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。
输出
对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。
示例输入
abca12345645abcddd
示例输出
14-1
提示
看了好长时间,终于名明白了,在网站上的资料里摸索了好长时间,还是自己看大神的代码悟出来的;
kmp和bf的格式基本是一样的,但kmp用的时间短,可以有效的利用一个 函数 ,这里我命名为next,构造出next后,可以“智能”的进行跳过没用的比较:
#include <stdio.h>#include <string.h>char S[1000010], T[100010];int next[100010];void Get_Next(){ int i = 0, j = -1, len = strlen(T); next[0] = -1; while(i < len) { if(j == -1 || T[i] == T[j]) { ++i; ++j; next[i] = j; } else { j = next[j]; } }}int KMP(){ int len1 = strlen(S), len2 = strlen(T); int i = 0, j = 0; while( i < len1 && j < len2) { if(S[i] == T[j] || j == -1) { ++i; ++j; } else { j = next[j]; } } for(i=0;i<len2;i++) printf("%d ",next[i]); if(j >= len2) return i-len2+1; else return -1; }void Solve(){ while(~scanf("%s", S)) { scanf("%s", T); Get_Next(); int Ans = KMP(); printf("%d\n", Ans); }}int main(){ Solve(); return 0;}
最后说一句,大神的代码就是高端大气,我本来自己写了一个,从头到尾就调用了一次,特别丑,所以把大神的代码贴上,能好懂点。
#include<stdio.h>#include<string.h>int next[1000001];char a[1000001],b[1000000];int Next (){int j=-1,i=0,n=strlen(b);next[0]=-1; while(i<n){if(j==-1||b[i]==b[j]){i++;j++;next[i]=j;}else j=next[j];}}int kmp(){int j=0,i=0,n=strlen(a),m=strlen(b);while(i<n&&j<m){if(j==-1||a[i]==b[j]){i++;j++;}else j=next[j];}if(j>=m)return (i-m+1);else return -1;}int main(){while(scanf("%s%s",a,b)!=EOF){Next();printf("%d\n",kmp());}}
以上是我的代码,明显不及啦
0 0
- kmp匹配
- kmp匹配
- 模式匹配---KMP算法
- kmp 模式匹配。。。。
- 模式匹配 KMP算法
- 模式匹配-KMP算法
- KMP 字符串匹配算法
- KMP模式匹配算法
- KMP模式匹配
- kmp字符串匹配算法
- kmp字符匹配算法
- KMP模式匹配
- KMP模式匹配
- kmp字符串匹配算法
- KMP字符串匹配算法
- KMP模式匹配算法
- 字符串匹配算法-kmp
- KMP匹配算法详解
- php字符串截取问题
- android屏幕分辨率适配调查结果以及总结
- 消息机制http://www.tuicool.com/articles/zYfaYz
- C语言链表求助!
- iOS开发:开发者账号申请后真机调试详细步骤
- kmp匹配
- 8) 多级结构数据成员指针memberPtr [原创,泛型编程,自由下载转载,需注明出处]
- 数组中第K小的数字
- cocos2d-x实现透视朦胧光照效果
- CSS 多浏览器兼容性问题及解决方案
- CString工作原理和常见问题分析
- 设计模式
- document.body.scrollTop||document.documentElement.scrollTop的意思
- fprintf()保存的数字是以字符串形式的?