日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

kmp匹配算法

發(fā)布時間:2023/12/10 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kmp匹配算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

kmp匹配算法

  • 1.第一種方式是暴利匹配方式
  • 2.第二種方式采用kmp 方式進(jìn)行匹配
  • 3. 相應(yīng)的代碼

1.第一種方式是暴利匹配方式

暴利匹配規(guī)則
模型: str1 位源字符串下標(biāo)為i,str2位匹配字符串,下標(biāo)為j 。 假設(shè) str1 匹配到i , str2 匹配到j(luò) 則有

  • (1)當(dāng) str1[i]==str2[j] 則 i++,j++ 繼續(xù)匹配下一個字符串
  • (2)當(dāng) str1[i]!=str2[j] 則 i=i-j+1(即 i向后移動一位),j則被置為0 即:j=0
  • 暴利匹配存在的問題,是存在大量的回溯問題,若不匹配則,移動到下一位,接著匹配。

2.第二種方式采用kmp 方式進(jìn)行匹配

實(shí)質(zhì)是對算法的進(jìn)一步優(yōu)化。

  • 主要是求出最長公共子序列的長度:規(guī)則是求前綴和后綴的共有元素
  • 比較過程中相比 暴利匹配,不能直接回歸到開始位置+1操作,而是找到公共位置字符串+1操作
  • 找到公共部分,需要使用前綴,后綴的公共的部分,來計(jì)算出公共子序列。(計(jì)算出部分匹配表)

部分匹配表的產(chǎn)生
部分匹配值”就是前綴和后綴的最長的共有元素的長度

  • 舉例: 以“ABCDABD”為例
    注意 !字符串為A 沒有前綴和后綴,共有元素(匹配的值)為0;

思路分析:
1.先得到子串的部分匹配表
2.使用部分匹配表完成kmp匹配(kmp 思想 =已經(jīng)匹配的值-部分匹配值)

3. 相應(yīng)的代碼

package acm;import java.util.Arrays;/*** @author qxl*/ public class KmpMatch {public static void main(String[] args) {String kmp ="abcdabcf";int[] ints = kmpMatch(kmp);System.out.println(Arrays.toString(ints));String str1="ababcddedfabc";String str2="abcda";kmpSearch(str1, str2);}private static int kmpSearch(String str1, String str2) {// 獲取部分匹配表int[] next = kmpMatch(str2);for(int i = 0, j = 0; i< str1.length(); i++){while (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;}return -1;}}public static int[] kmpMatch(String source){// 設(shè)置部分部分匹配標(biāo)記 例如 0,0,0,1,2 表示 前綴后綴的公共部分為2int [] next=new int[source.length()];//字符串為1時 前綴和后綴為空集next[0]=0;// i=1 表示后綴,j=0 表示前綴for(int i=1,j=0;i<source.length();i++){// source.charAt(i) !=source.charAt(j) j需要已匹配的滑動窗口中獲取新值next[j-1]while(j>0 && source.charAt(i)!=source.charAt(j)){j=next[j-1];}if(source.charAt(i)==source.charAt(j)){j++;}next[i]=j;}return next;} }

總結(jié)

以上是生活随笔為你收集整理的kmp匹配算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。