在乙個很長的字串 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分別指示串中下乙個位置,繼續比較後續的字元 若不相等,指標後退重...