码迷,mamicode.com
首页 > 其他好文 > 详细

字符串匹配(KMP)

时间:2018-12-06 15:23:26      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:string   整数   pac   scan   names   kmp   ++   oid   center   

字符串匹配
 

题目描述

设计一个程序,从一个主字符串中查找一个子字符串在主串中第一次出现的位置。主串和子串的长度不超过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\n",Index_KMP(S,T,1));
58     }
59     return 0;
60 }

 

字符串匹配(KMP)

标签:string   整数   pac   scan   names   kmp   ++   oid   center   

原文地址:https://www.cnblogs.com/geziyu/p/10076736.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!