KMP模式比對 二(串),kmp模式比對
原文請訪問我的部落格:xiaoshig.sinaapp.com
KMP模式比對 二(串)
Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %lluSubmit Status
Description
輸入一個主串和一個子串,用KMP進行匹配,問進行幾趟匹配才成功,若沒成功,則輸出0
Input
輸入一個主串和一個子串
Output
匹配的趟數
Sample Input
ababcabcacbababcac
Sample Output
3
#include<iostream>#include<cstring>using namespace std;int a[100000];char c[10000];char b[100000];int main(){int j,n,i,k;cin>>c;cin>>b;a[0]=-1;j=-1;i=0;while(b[i]!='\0'){if(j==-1||b[j]==b[i]){j++;i++;//if(b[i]!=b[j])a[i]=j;//else//{if(a[j]==-1)//a[i]=0;//else//a[i]=a[j];}}else j=a[j];}i=0;j=0;k=0;n=1;while(c[i]!='\0'){if(c[i]==b[j]){i++;j++;if(b[j]=='\0'){k=1;break;}}else if(a[j]==-1){i++;j=0;n++;}else {j=a[j];n++;}}if(k==0)cout<<-1<<endl;else cout<<n<<endl;return 0;}
資料結構 字串 模式比對問題 KMP演算法
你的程式本身思路沒有錯,但錯在以下幾點:
1.在程式中有字串S和T,你用S[0]代表字串的長度,但S是字串,S[0]是長度嗎?
2.在main函數中,你輸入的S和T都是用gets(S)或gets(T),那麼它們都是以下標0開頭的,你應該要進行處理,使它以下標1作為開頭(可以這樣gets(&S[1]); 然後S[0] = strlen(&S[1]) + '0';在用S[0]作為長度的時候,把它從字元變成數字就行了)。
資料結構KMP模式比對演算法的next[j]為何是下面寫的那樣
你的理解有點偏差,設模式串為string[i],求next[j]不是前面一個相等就加一,而是要看前面緊接的子串有多少個相等,j=4時緊接的子串只有string[3]==string[1],故next[j] =2,同理j=5時也只有string[4]==string[1],故next[j] =2。如果要next[5]=3,必須要滿足string[3]==string[1]並且string[4]==string[2]的條件。
你看的是不是清華大學那本資料結構呢,有點說的不清不楚的。那個求next數組的演算法多看幾遍就可明白了。