字符串匹配(KMP)

Posted geziyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串匹配(KMP)相关的知识,希望对你有一定的参考价值。

字符串匹配
 

题目描述

设计一个程序,从一个主字符串中查找一个子字符串在主串中第一次出现的位置。主串和子串的长度不超过100。如果找不到,则输出-1.

程序输入说明

第一行输入一个整数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)的主要内容,如果未能解决你的问题,请参考以下文章

字符串匹配(KMP 算法 含代码)

KMP字符串匹配模板代码

数据结构—串KMP模式匹配算法

KMP(字符串匹配算法)

KMP算法解决字符串匹配问题(详细步骤图解)

KMP字符串匹配算法