資料結構實驗之串一:KMP簡單應用
阿新 • • 發佈:2018-12-14
Problem Description
給定兩個字串string1和string2,判斷string2是否為string1的子串。
Input
輸入包含多組資料,每組測試資料包含兩行,第一行代表string1(長度小於1000000),第二行代表string2(長度小於1000000),string1和string2中保證不出現空格。
Output
對於每組輸入資料,若string2是string1的子串,則輸出string2在string1中的位置,若不是,輸出-1。
Sample Input
abc
a
123456
45
abc
ddd
Sample Output
1
4
-1
tips:快被這題逼瘋了
while(i<strlen(b))
{
if(j==-1||b[i]==b[j])
{
ne[++i]=++j;
}
else
j=ne[j];
}
一開始這樣寫while迴圈一直超時,找半天找不出來,超時的原因也很簡單就是寫裡面的時候每次迴圈的時候都會掃描一遍字串的長度.........這點東西都看不出來我真是蠢到家。後來改一下遍歷一遍就可以了:
#include<bits/stdc++.h> using namespace std; int ne[1000000]; char a[1000000],b[1000000]; void getnext() { int i=0,j=-1; ne[0]=-1; int k=strlen(b); while(i<k) { if(j==-1||b[i]==b[j]) { ne[++i]=++j; } else j=ne[j]; } } void kmp() { int i=0,j=0; int len1=strlen(a); int len2=strlen(b); while(i<len1&&j<len2) { if(j==-1||a[i]==b[j]) { ++i; ++j; } else j=ne[j]; } if(j==len2) printf("%d\n",i-len2+1); else printf("-1\n"); } int main() { while(gets(a)) { gets(b); getnext(); kmp(); } return 0; }