AcWing刷題 KMP字串(經典)

2022-09-20 23:06:08 字數 1614 閱讀 9878

給定乙個模式串 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

輸入樣例:

3aba

5ababa

輸出樣例:

0 2

1

import 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。輸出格式 共...