数据结构实验之串一:KMP简单应用

来源:互联网 发布:zarchiver解压数据错误 编辑:程序博客网 时间:2024/06/18 17:56


Time Limit: 1000MSMemory Limit: 65536KB
SubmitStatistic

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
kmp算法就是在BF朴素算法的基础上改进的,从原来的i和j要分别回退很长的距离,到kmp的i不用回退,而j回退到next[j];
寻找next[j]的过程和kmp的过程其实与Bf算法的过程相似。
#include <stdio.h>#include <string.h>int next[1000001]; char str1[1000001],str2[1000001];  void getNext(){int i = 0;next[0] = -1;int j = -1;
int len = strlen(str2);while(i < len){if(j == -1||str2[i] == str2[j]){i++;j++;next[i] = j;}else j = next[j];}}int kmp(){int i = 0, j = 0;getNext();
int len1 = strlen(str1);
int len2 = strlen(str2);while(i < len1&&j < len2){if(j == 0||str1[i] == str2[j]){i++;j++; }else j = next[j];}if(j >= len2)return i-len2+1;else return -1;}int main(){while(~scanf("%s", str1)){scanf("%s", str2);printf("%d\n", kmp());}return 0;}

原创粉丝点击