kmp演算法總結

2021-09-07 06:14:48 字數 868 閱讀 3515

kmp演算法一般分兩部getp和kmp;getp是為了得到p陣列,這個陣列很神奇,p[i]=j;代表第i-1位最近一次失配的位置;

i         1  2  3  4  5  6  7  8

s[i]     a  b  a  b  a  b  a  b 

p[i]    0  0 1  2  3  4  5  6

p[i]均代表的是最近一次失配的位置;

有了失配位置,那麼我們很容易得到迴圈節;當前迴圈節長度就是i-p[i];很容易求得當i%(i-p[i])==0(當然p[i]!=-1)的時候代表字串開始迴圈,迴圈到i-1;

當迴圈,我們可以求出迴圈次數i/(i-p[i]);

重刷了kmp的題;

總結下:

找串的重複度,相當於求迴圈次數;

相對於上題,這題不是從自身找,而是串2在串1中出現的次數;(完全出現)

當找到串2結束時,我們只需要回到串2 起點重新匹配就好了;

相對於上題,這兩個題也是串2在串1中出現的次數;但是這個相當於看**找文字一樣,假設abab abababab 這個題答案是3,上個題就是2,上個是剪布條,只有是abab  abab 這個是匹配文字,所以是三個,位置:1 4,2 6,4 8;

讓在乙個串中找字串,使這個字串即是串s的字首又是字尾;我們需要知道

當i%(i-p[i])==0(當然p[i]!=-1)的時候代表字串開始迴圈,迴圈到i-1;可以求出迴圈次數i/(i-p[i]);

第二個串能否在第乙個串迴圈位移後的串中找到;我們只需要把串翻轉下就好了;

s的子串中不包含s1,s2...sn的最長串;

這個題就比較綜合了,用到貪心的策略,用kmp找位置,貪心求長度就好了;

新增串使其回文;反轉串進行kmp匹配即可;

KMP演算法總結

kmp題目重在理解next陣列的含義 next陣列的作用 next j 記錄模式串中第 j 個字元的最長公共字首長度 重要,這是它的意義所在 第二種理解方式,當模式串與主串失配時,跳回的位置。next len 即字串 0 結束標誌的next值 單個字串匹配時與週期有關 hdu 1711 模板題 33...

KMP演算法總結

kmp演算法是用來實現模式匹配的,其時間複雜度是o m n 具體原理見 其中有用到next陣列來計算子串中公共項的位數,簡單來說,就是子串遇到不匹配時,就查next資料來決定前進幾位 移動位數 已匹配的字元數 對應的部分匹配值 1 要不要減一看next陣列第一位是不是為1,個人覺得加一後是有好處的,...

KMP演算法總結

現在假設有兩個字串a bbc abcdab abcdabde,b abcdabd。現在要在a中找b。比較暴力的方法是直接搜尋 void gosearch 上述 最核心就是while迴圈,舉兩個例子說明其作用 還是選取b串作為說明。假設現在要求next 6 那麼當前的j next 5 1 next陣列...