数据结构实验之串一:KMP简单应用
Time Limit: 1000 ms
Memory Limit: 65536 KiB
Problem Description
给定两个字符串string1和string2,判断string2是否为string1的子串。
Input
输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。
Output
对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。
Sample Input
abc a 123456 45 abc ddd
Sample Output
1 4 -1
以此为例,浅谈对“看毛片”算法的理解;;
#include <stdio.h> #include <stdlib.h> #include <string.h> char s1[1000005],s2[1000005]; int next[1000005]; void get_next(char s[1000005]) { int i = 0; int len = strlen(s); next[0] = -1; int j = -1; while(i < len-1) { if( j == -1 || s[i] == s[j]) { ++i; ++j; if( s[i] != s[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",s1)!=EOF) { scanf("%s",s2); get_next(s2); int wz = kmp(s1,s2); printf("%d\n",wz); } return 0; }
人如其名, 算法也是这样, 它真是对得起这个名字, 耐得把玩, 经的琢磨。
两句话稍稍说下我的理解吧。
KMP算法的应用于字符串匹配问题,就是比较原串的每一项跟子串的每一项,当遇到不匹配的一项时,原串标的位置不变,子串返回最长公共前后缀长度的下一位,再往后循环看是否匹配。next数组也叫失配数组,为了得到最长公共前后缀长度。
OK, 暂时就这些, 有空再详细理解理解吧。。