2018/2/21 每日一學 KMP算法
阿新 • • 發佈:2018-02-21
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算法