数据结构实验之串二:字符串匹配
Time Limit: 1000 ms
Memory Limit: 65536 KiB
Problem Description
给定两个字符串string1和string2,判断string2是否为string1的子串。
Input
输入包含多组数据,每组测试数据包含两行,第一行代表string1,第二行代表string2,string1和string2中保证不出现空格。(string1和string2大小不超过100字符)
Output
对于每组输入数据,若string2是string1的子串,则输出"YES",否则输出"NO"。
Sample Input
abc a 123456 45 abc ddd
Sample Output
YES YES NO
这依然是应用KMP算法。
#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 1; else return 0; } int main() { while(scanf("%s",s1)!=EOF) { scanf("%s",s2); get_next(s2); if(kmp(s1,s2)) printf("YES\n"); else printf("NO\n"); } return 0; }