用途:處理字符串匹配問題
例子:給出兩個字符串s1和s2,其中s2爲s1的子串,求出s2在s1中所有出現的位置
時間複雜度:O(n)
變量解釋:
A[i]:存儲A串
B[i]:存儲B串
p[i]:在B串中與字母B[i]相同的上一個字母的位置 給出兩個字符串s1和s2,其中s2爲s1的子串,求出s2在s1中所有出現的位置
預處理p[]:
void pre()
{
p[1]=0;
int j=0;
for (int i=1;i<m;i++)
{
while (j>0&&B[j+1]!=B[i+1]) j=p[j];
if (B[j+1]==B[i+1]) j++;
p[i+1]=j;
}
}
KMP:
int kmp()
{
int j=0;
for (int i=0;i<n;i++)
{
while (j>0&&B[j+1]!=A[i+1]) j=p[j];
if (B[j+1]==A[i+1]) j++;
if (j==m)
{
printf("%d\n",i+1-m+1);
j=p[j];
}
}
}