給定乙個模式串 s
'>s
,以及乙個模板串 p
'>p
,所有字串中只包含大小寫英文本母以及阿拉伯數字。
模板串 p s
'>p
'>在模式串 s
中多次作為子串出現。
求出模板串 p s
'>p
'>s
'>在模式串 s
中所有出現的位置的起始下標。
輸入格式
第一行輸入整數 ns
'>p
'>s
'>s
'>,表示字串 p
的長度。
第二行輸入字串 p 。
第三行輸入整數 ms
'>p
'>s
'>s
'>p
'>,表示字串 s
的長度。
第四行輸入字串 s 。
輸出格式
共一行,輸出所有出現位置的起始下標(下標從 0 開始計數),整數之間用空格隔開。
資料範圍
1 <= n <= 10^5
1 <= m <= 10^6
輸入樣例:
3aba5ababa
輸出樣例:
0 2
1import j**a.util.*;
2import j**a.io.*;34
public
class
main
39//
j表示當前匹配成功的長度(即最長公共前字尾)
40 next[i] =j;41}
42}4344
public
static
void main(string args) throws
exception
53for (int i = 1; i <= m; i ++)
5657
next();
5859
//for (int i = 1; i <= n; i++ )
6263
"拉拉\n");
6465
//j表示當前的匹配位置(不是下標,因為是按1開始遍歷的)
66for (int i = 1, j = 0; i <= m; i++)
72//
如果當前位置,模板串p跟模式串s相同,且j == 0,則僅僅讓模式串s向後移動一位,因為此時第乙個就匹配失敗了
73/*
74j > 0,代表此時模板串中已經跟模式串s部分匹配(且一定是前半部分)
75如果是這種情況的話,按照我們人類的想法,如果有匹配的我們就讓模
76板串和模式串都往後移動一位,如果後一位匹配匹配不上,則讓模板串p
77通過next陣列跳到當前最大公共前字尾的後一位,繼續跟模式串的當前位
78置的字元進行比較,重複以上操作。
79*/
80//
判斷此時是否已經匹配成功,即j == n(表示匹配成功的長度已經等於模板串的長度)
81if (j ==n) 85}
86writer.flush();87}
8889 }
2021 1 27 刷題(KMP字串匹配)
題目描述 實現 strstr 函式。給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。示例 1 輸入 haystack hello needle ll 輸出 2 示例 2 輸入 hays...
字串刷題
刷題總結 kuangbin帶你飛 專題十六 kmp 擴充套件kmp manacher cloned a kmp模板題 include using namespace std typedef long long ll const int ma 1e6 5 int p ma int m ma int n...
AcWing 831 KMP字串(模板)
給定乙個模式串s,以及乙個模板串p,所有字串中只包含大小寫英文本母以及阿拉伯數字。模板串p在模式串s中多次作為子串出現。求出模板串p在模式串s中所有出現的位置的起始下標。輸入格式 第一行輸入整數n,表示字串p的長度。第二行輸入字串p。第三行輸入整數m,表示字串s的長度。第四行輸入字串m。輸出格式 共...