最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

KMP算法——數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)

2022-11-21 22:01 作者:限量版范兒  | 我要投稿

KMP算法

算法的背景

KMP 是一個解決模式串在文本串是否出現(xiàn)過,如果出現(xiàn)過,最早出現(xiàn)的位置的經(jīng)典算法

核心思想

KMP 方法算法就利用之前判斷過信息,通過一個 next 數(shù)組,保存模式串中前后最長公共子序列的長度,每次回溯時(shí),通過 next 數(shù)組找到,前面匹配過的位置,省去了大量的計(jì)算時(shí)間。

算法圖解:

當(dāng)算法移動到上述位置時(shí):(發(fā)生不匹配)

發(fā)現(xiàn)公共前后綴為A,于是移動公共前后綴到下面位置

為什么能夠保證移動時(shí)就不會出現(xiàn)再匹配的情況呢

因?yàn)檫@里可以采用反證的手段,如果在移動時(shí)出現(xiàn)匹配,則就說明公共前后綴與所確定的模式串的公共前后綴不同,這就產(chǎn)生矛盾了。

KMP算法的思考

核心代碼

求next數(shù)組(這里next數(shù)組表示模式串的公共前后綴個數(shù))

//獲取字符串的部分匹配值表 ? ?public static int[] kmpNext(String dest){ ? ? ? ?int[] next = new int[dest.length()]; ? ? ? ?next[0] = 0; ? ? ? ?for (int i = 1, j = 0; i < dest.length(); i++) {//j可以代表匹配時(shí)的一個計(jì)算變量 ? ? ? ? ? ?if(dest.charAt(i) == dest.charAt(j)) { ? ? ? ? ? ? ? ?j++; ? ? ? ? ? ?}else{ ? ? ? ? ? ? ? ?j = next[j - 1];//如果出現(xiàn)匹配不成功則直接賦值0 ? ? ? ? ? ?} ? ? ? ? ? ? ? ?next[i] = j;//找到i對應(yīng)的j值,比如第一個字母A就是1,AB就是2 ? ? ? ?} ? ? ? ?return next; ? ?}

KMP算法

public static int kmpSearch(String str1,String str2,int[] next){ ? ? ? ?for (int i = 0,j = 0; i < str1.length(); i++) {//這里使用兩個指針進(jìn)行匹配 ? ? ? ? ? ?while(j > 0 && str1.charAt(i) != str2.charAt(j)){ ? ? ? ? ? ? ? ?j = next[j - 1];//這里是核心中的核心 ? ? ? ? ? ?} ? ? ? ? ? ?if(str1.charAt(i) == str2.charAt(j)){ ? ? ? ? ? ? ? ?j++;//指針前移 ? ? ? ? ? ?} ? ? ? ? ? ?if(j == str2.length()){ ? ? ? ? ? ? ? ?return i - j + 1;//這加個1是因?yàn)榭紤]到索引問題 ? ? ? ? ? ?} ? ? ? ?} ? ? ? ?return -1; ? ?}

鏈接:https://www.dianjilingqu.com/617758.html

KMP算法——數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)的評論 (共 條)

分享到微博請遵守國家法律
泽州县| 平舆县| 镇康县| 福建省| 英吉沙县| 宁安市| 红原县| 乌什县| 青冈县| 万盛区| 晴隆县| 和静县| 南木林县| 大理市| 元阳县| 麻江县| 威信县| 巧家县| 开鲁县| 邹平县| 荆州市| 石泉县| 始兴县| 漳平市| 马鞍山市| 丽江市| 手游| 浮山县| 平和县| 长海县| 镇安县| 孝感市| 达拉特旗| 闽侯县| 会昌县| 金平| 耒阳市| 阿拉尔市| 洪江市| 襄垣县| 葫芦岛市|