1. 程式人生 > >2018/2/21 每日一學 KMP算法

2018/2/21 每日一學 KMP算法

blog == body 什麽 匹配 算法 學會 問題 關系

KMP算法

什麽是KMP算法?

先問個問題:給定字符串a和b,滿足b一定是a的子串,問第一次b和a重疊的b[1]所對應的a的序號。

舉個例子:a:ababcedabced,b:abced

那麽答案顯然是3,即a[3]開始第一次與b相同。

那麽很容易想到的暴力算法為O(N*M),對吧?

顯然容易TLE……

這裏我們介紹一種簡單的字符串匹配算法:KMP。

舉個例子:a:ababc,b:abc;

i=1,j=1時,a[i]=b[j],繼續,i++,j++,a[i]=b[j],繼續,i++,但是這是a[i]!=b[j+1],j不能++,

怎麽辦?

我們可以把b數組整體遷移,(註意對應關系,如下)

a:ababc

b: abc

這是j=1,i=3,a[i]=b[j],繼續……

那麽我們不難得到主函數:

j=0;
for(int =1;i<=n;i++)
{
while(j>0&&b[j+1]!=a[i]) j=p[j];
if(b[j+1]=a[i]) j++;
if(j==m) ans=i-m;
}

那麽p數組怎麽求,即怎麽把b數組移位?
跟主函數很像:

p[1]=0;
j=0;
for(int i=2;i<=m;i++)
{
while(j>0&&b[j+1]!=b[i])j=p[j];
if(b[j+1]==b[i]) j++;
p[i]
=j; }

你學會了嗎?

2018/2/21 每日一學 KMP算法