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数组就是存储了前缀字符与后缀字符相同的个数,方便后移比较。
     
代码实现:
#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
原创粉丝点击