1. 程式人生 > >字符串匹配(KMP)

字符串匹配(KMP)

aaa body pre for head mit pos type scan

字符串匹配

題目描述

設計一個程序,從一個主字符串中查找一個子字符串在主串中第一次出現的位置。主串和子串的長度不超過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)