kmp匹配算法
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é)
- 上一篇: 脚本命令_SAP HANA数据库备份命令
- 下一篇: 正确安装傲腾的方式