动态规划-KMP字符匹配算法
生活随笔
收集整理的這篇文章主要介紹了
动态规划-KMP字符匹配算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
動態規劃之KMP字符匹配算法
把KMP看成輸入不只有0/1的Moore型(數字邏輯)(直接ASCII:266或是大小寫:52) **
看成動歸:狀態,和選擇
構建狀態轉移圖
分成狀態推進,與重啟
要去的狀態:
影子狀態(我編的名字),用變量 X 表示。所謂影子狀態,就是和當前狀態具有相同的前綴。(應該是要對他遍歷)
KMP 就是要盡可能少的回退**,以免多余的計算:j 就可以去問問和自己具有相同前綴的 X,如果 X 遇見 “A” 可以進行「狀態推進」,那就轉移過去
那就是從大數往開頭遍歷,遇到可以推進的:
如果遇到的字符是 “B”,狀態 X 也不能進行「狀態推進」,只能回退
因為 X 永遠跟在 j 的身后,狀態 X 如何轉移,在之前就已經算出來了(動態規劃思想:利用過去的結果解決現在的問題)
c++如何取出string中的第一個字符…
沒沒看懂:
X是pat自己匹配自己
核心在于:
1.j游標下,只有獲得pat 【j】才會加一,其他都可以由狀態X決定
2.X游標下,X一定落后于j,直接用j做好的數組,就可以決定X的狀態轉換,因為j從1開始,X從0開始,越拉越遠
而其中X = dp[X][pat.charAt(j)];就相當于,當前X獲得了j的輸入,會怎么樣,
public class KMP {private int[][] dp;private String pat;public KMP(String pat) {this.pat = pat;int M = pat.length();// dp[狀態][字符] = 下個狀態dp = new int[M][256];// base casedp[0][pat.charAt(0)] = 1;//只有遇到 pat[0] 這個字符才能使狀態從 0 轉移到 1,其他都是0狀態// 影子狀態 X 初始為 0///就是最開始你們只要錯了就都回最開始int X = 0;// 當前狀態 j 從 1 開始for (int j = 1; j < M; j++) {for (int c = 0; c < 256; c++) {if (pat.charAt(j) == c) dp[j][c] = j + 1;//意思是下一個狀態else dp[j][c] = dp[X][c];//意思是狀態退回到影子狀態時獲得C的情況(且,dpX,C (如X狀態下獲得C不加一的話)還與dpX-1,C相同 )}// 更新影子狀態X = dp[X][pat.charAt(j)];///j進了1,相應的X,就是原來的X 時,獲得了j所應有的狀態}}public int search(String txt) {...} }看完上面:看summary的會更扎實
動圖找gif分解看吧
翻墻就行
總結
以上是生活随笔為你收集整理的动态规划-KMP字符匹配算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java第六章工具包P6-03.Opti
- 下一篇: spark on yarn 安装笔记