kmp題目重在理解next陣列的含義:
next陣列的作用 :next[j]
記錄模式串中第 j 個字元的最長公共字首長度(重要,這是它的意義所在)
第二種理解方式,當模式串與主串失配時,跳回的位置。
next[len] (即字串'\0'結束標誌的next值):單個字串匹配時與週期有關
hdu 1711(模板題)
3336
1358
2203
2594
3746
hdu 1711
#include #include using namespace std;
int a[1000005],b[10005];
int p[10005];
int n,m;
void getnext ()
if (b[i] == b[j+1]) j++;
p[i] = j;
} } void kmp ()
if (b[j+1] == a[i]) j++;
if (j == m)
} printf("%d\n",-1);
} int main ()
return 0;
}
hdu 3746
#include #include #define len 1000001
int next[len];
int len;
char str[len];
void getnext()
else
}}int main()
else if(len%period == 0)
else
}return 0;
}
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陣列...
kmp演算法總結
kmp演算法總結 kmp演算法,是一種減少字串匹配時複雜度的演算法,本演算法減少了兩個字串遇到不相等的情況是的匹配次數,也就是減少了主串的回溯次數,跳過了不必要的匹配,使原來的m n的時間複雜度變成了m n。kmp演算法大致分為兩個部分 next陣列,next陣列記錄了模式串字首字尾的長度,求模式串...