字符串匹配(KMP)
Posted geziyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串匹配(KMP)相关的知识,希望对你有一定的参考价值。
字符串匹配
题目描述
设计一个程序,从一个主字符串中查找一个子字符串在主串中第一次出现的位置。主串和子串的长度不超过100。如果找不到,则输出-1.
程序输入说明
第一行输入一个整数N,说明需要进行匹配的实例数。
第二行输入第一组需要进行匹配的主串
第三行输入第一组需要匹配的子字符串。
以下各行按照上面两行的格式输入,直到输入了N组匹配实例。
第二行输入第一组需要进行匹配的主串
第三行输入第一组需要匹配的子字符串。
以下各行按照上面两行的格式输入,直到输入了N组匹配实例。
程序输出说明
输出N行,每行显示对应的匹配组中子串在主串中第一次出现的位置。
程序输入样例
3 abaaaaaa a bacdeagb ac aaaa bb
程序输出样例
1 2 -1
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 typedef char* String; 7 8 int len1,len2; 9 char S[110]; 10 char T[110]; 11 12 void get_next(String T,int *next){ 13 int j = 0; 14 int i = 1; 15 next[1] = 0; 16 while( i<len2 ){ 17 if(0==j || T[i]==T[j]) 18 { 19 i++; 20 j++; 21 next[i] = j; 22 } 23 else{ 24 j = next[j]; 25 } 26 } 27 } 28 29 int Index_KMP(String S,String T,int pos){ 30 int i=pos; 31 int j=1; 32 int next[255]; 33 get_next(T,next); 34 while(i<=len1&&j<=len2){ 35 if(j==0||S[i]==T[j]){ 36 i++; 37 j++; 38 } 39 else{ 40 j=next[j]; 41 } 42 } 43 if(j>len2){ 44 return i-len2; 45 } 46 else 47 return -1; 48 } 49 50 int main(){ 51 int n; 52 cin>>n; 53 while(n--){ 54 scanf("%s%s",S+1,T+1); 55 len1 = strlen(S+1); 56 len2 = strlen(T+1); 57 printf("%d ",Index_KMP(S,T,1)); 58 } 59 return 0; 60 }
以上是关于字符串匹配(KMP)的主要内容,如果未能解决你的问题,请参考以下文章