開始從重新學字串了,改過自新吧…
洛谷p3375 【模板】kmp字串匹配
定義模式串為b
bb,文字串為a
aa(很長)
假如我們處理出了乙個b
bb的kmp
kmpkm
p陣列其中k mp
[i
]kmp[i]
kmp[i]
表示[ 1,
i]
[1,i]
[1,i
]中的最長公共前字尾,有什麼辦法加速匹配嗎??
比如匹配
a=abcacababcab
b=abcab
比如現在匹配到第五位,發現b[5
]!=a
[5
]b[5]!=a[5]
b[5]!=
a[5]
,怎麼辦??把b
bb右移一位繼續匹配??
實際上,我們可以直接右移三位
abcacababcab
abcab
為什麼??感性理解就是前後有字母相同,不需要再重複比較
因為k mp
[4]=
1kmp[4]=1
kmp[4]
=1,所以可以直接匹配從模式串的第二個字元開始嘗試匹配。。。
int j =0;
//初始模式串匹配位置為0
for(
int i=
1;i<=n;i++
)//匹配成功
}
如何處理kmp
kmpkm
p陣列??原理一樣,讓模式串自己匹配自己即可
int j =0;
//當前匹配到低第幾位
for(
int i=
2;i<=m;i++
)
模板
#include
using
namespace std;
const
int maxn =
2e6+10;
char a[maxn]
,b[maxn]
;int n,m,kmp[maxn]
;void
kmp(
) j =0;
for(
int i=
1;i<=n;i++)}
for(
int i=
1;i<=m;i++
)printf
("%d "
,kmp[i]);
}int
main()
KMP(單模式匹配)
單字串匹配,返回匹配位址 求出匹配總次數 求迴圈元,t len next len next陣列的有效範圍是 0,len len的時候,next為有效值 只需要記住next 0 1,next 1 0,這兩個條件就可以寫出求next的函式 匹配過程只需要o n 所以i的值不需要回歸。這裡曾經糾結很久,m...
單模式字串匹配演算法KMP
kmp演算法 2int kmp char s,file file,int pos 3 else 否則,下標指向當前字元的前乙個匹配項 12i next i 13if i 1 17 18 if s i 0 else 否則返回 1 22 return 1 23 獲得模式串的next陣列演算法 演算法中c...
KMP 單模式匹配, 實現 strStr
knuth morris pratt演算法 kmp 單模式匹配,判斷s1是否是s2的子串 原理 通過乙個輔助函式next 實現跳過不必要的目標字串,已達到優化效果 時間複雜度 o m n 主要思想 在失配之後,並不簡單的從目標串的下乙個字元開始新一輪的檢測,而是依據在檢測之前得到的有用資訊,直接跳過...