演算法與資料結構 字串模式匹配 KMP 演算法

2021-09-28 19:57:25 字數 1332 閱讀 9986

在乙個很長的字串 t 中,查詢是否存在子字串 p。例如搜尋引擎收錄的大量**資料,當使用者輸入關鍵字後,就會在這些資料中進行匹配,並返回合適的**。

語義:假定字串長度為 j,則所有字串都在[0, j)這樣的集合中。

返回首次匹配的字元的位置。注意這裡呼叫方需要判斷位置是否正確,例如對於長度為 i 的字串,要查詢是否有長度為 j 的字串,如果返回值在[0, i - j)則為正確匹配到資料,否則就是失敗。

每次用 t 的乙個字元匹配 pattern 的所有字元,全部匹配成功則返回首字元下標,否則 t 前進乙個字元,繼續匹配:

#include

#include

intmatch

(char

*str,

char

*pattern)

while

(i < slen && j < plen)

else

}return i - j;

}int

main

(void);

int i, ret;

int len =

sizeof

(pattern)

/sizeof

(char*)

;for

(i =

0; i < len; i++

)return0;

}

這裡通常取的是真字首(不包含最後乙個字元)和真字尾(不包含第乙個字元)。長度相同的前字尾就是公共前字尾。

例如:任意的字串 p,對其每個字元前面的子字串找最長公共前字尾,得到的這個陣列就是字首表。

例如,對於字串ababc

最終的字首表陣列:[-1, 0, 0, 1, 2]

package main

import "fmt"

func kmp(target string, pattern string) int

if target[i + k] == pattern[k]

} else }}

return ret

}func buildprefixtable(str string) int

for i := range str

pre := str[:i]

j := len(pre) - 1

for j > 0

j = j - 1

}if len(ret) < len(pre) + 1

}return ret

}func main()

資料結構 字串 模式匹配

我們先把模式串標出序號 接著把模式串所有字首依次列出來 接下來把每乙個子串相等的字首和字尾的最大長度求出,舉個例子 abaab 觀察子串,前字尾ab相同,因此返回2 5.依次類推,我們可以得到每乙個子串對應的一組序列 當時這組資料並不是所要求的next陣列,可以將其稱為部分匹配值表,相應c 如下 獲...

資料結構與演算法 字串匹配 BF演算法

又稱暴力匹配演算法,是一種樸素的模式匹配演算法 給定主串 s bilibili 和子串 t bilididi 1.主串 s 第一位開始與子串 t 第一位匹配,b 與 l 不匹配,匹配失敗 2.主串 s 第二位開始與子串 t 第一位匹配,i 與 l 不匹配,匹配失敗 3.主串 s 第三位開始與子串 t...

011 資料結構與演算法 字串匹配演算法

思路 1.分別利用計數指標i和j指示主串s和模式t中當前正待比較的字元位置,i初值為pos,j的初值為1 2.如果2個串均為比較到串尾,即i和j均小於等於s和t的長度時,則迴圈執行以下的操作 s i 和t j 比較,若相等,則i 和 j分別指示串中下乙個位置,繼續比較後續的字元 若不相等,指標後退重...