KMP
来源:互联网 发布:海西商品交易所软件 编辑:程序博客网 时间:2024/05/10 19:26
数据结构实验之串一:KMP简单应用
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
给定两个字符串string1和string2,判断string2是否为string1的子串。
Input
输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。
Output
对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。
Example Input
abca12345645abcddd
Example Output
14-1
Hint
Author
cjx
*******理解:
此题目是KMP算法的学习,若理解KMP再来写代码,会简单。
KMP:http://kenby.iteye.com/blog/1025599
(感觉这个博主写的很好,可以看看,谢谢博主)
next数组就是存储了前缀字符与后缀字符相同的个数,方便后移比较。
代码实现:
*******理解:
此题目是KMP算法的学习,若理解KMP再来写代码,会简单。
KMP:http://kenby.iteye.com/blog/1025599
(感觉这个博主写的很好,可以看看,谢谢博主)
next数组就是存储了前缀字符与后缀字符相同的个数,方便后移比较。
代码实现:
#include <stdio.h>#include <stdlib.h>#include <string.h>char m[1000006], n[1000006];int next [1000006];void getnext(char m[]){ int i = 0, len = strlen(m); next[0] = -1; int j = -1; while(i<len) { if(j==-1||m[i]==m[j]) { i++; j++; if(m[i]!=m[j]) next[i] = j; else next[i] = next[j]; } else j = next[j]; }}int kmp(char *s, char *p){ int len1 = strlen(s); int len2 = strlen(p); int i = 0; int j = 0; while(i<len1&&j<len2) { if(j==-1||s[i]==p[j]) { i++, j++; } else j = next[j]; } if(j>=len2) return i-len2+1; else return -1;}int main(){ while(~scanf("%s", m)) { scanf("%s", n); getnext(n); int b = kmp(m, n); printf("%d\n", b); } return 0;}
0 0
- KMP
- KMP
- KMP
- KMP
- KMP
- KMP
- kmp
- kmp
- KMP
- kmp
- KMP
- KMP
- KMP
- kmp
- KMP
- KMP
- kmp
- KMP
- C++中虚析构函数的作用
- C语言strcpy()函数:复制字符串
- Core Data入门
- 我的“第一个”春节
- [Android] 即时通信 Openfire + Smack 4.19 +百度定位
- KMP
- 技术宅找女朋友的技术分析
- liunx下对于modification time(更改mtime),status time(ctime),access time(atime)的理解与
- 【Ubuntu】安装matlab
- 这儿有自学前端开发的吗-
- HTTP
- Jmeter的参数化方法
- python 安装扩展包错误整理
- 1、JDBC介绍及简单的查询功能