package org.kmp.kmp;
/**
* 暴力匹配算法
* @author cjj_1
* @date 2020-09-07 9:13
*/
public class KmpDemo {
public static void main(String[] args) {
// String str1 = "尚硅谷 尚硅股你尚硅 尚硅谷你尚硅谷你尚硅谷你好";
// String str2 = "尚硅谷你尚硅谷你";
// int index = getMatchIndex(str1,str2);
String str1 = "BBC ABCDAB ABCDABCDABDE";
String str2 = "ABCDABD";
int[] next =new int[str2.length()];
getNextArr(str2,next);
int index = searchKMP(str1,str2,next);
System.out.println(index);
}
/**
* 暴力匹配算法
* 获取str1普配到str2的首字母的下标
* @param str1
* @param str2
* @return
*/
public static int getMatchIndex(String str1,String str2){
int i = 0;
int j =0;
while (i<str1.length() && j<str2.length()){
if(str1.charAt(i)== str2.charAt(j)){
i++;
j++;
}else {
i=i-(j-1);
j=0;
}
}
if(j==0){
return -1;
}else {
return (i-j);
}
}
/**
* kmp搜索
* @param str1 文本字符串 BBC ABCDAB ABCDABCDABDE
* @param str2 模板字符串 ABCDABD
* @param next 模板字符串匹配值表
* @return 匹配的下标。
*/
public static int searchKMP(String str1,String str2,int[] next){
int j=0;
for(int i =0;i<str1.length();i++){
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);
}
return -1;
}
/**
* 获取字符串的 匹配值表 next[];
* @param str
* @param next
*/
public static void getNextArr(String str,int[] next){
next[0] = 0;
for (int i =1,j=0;i<str.length();i++){
while (j>0 && str.charAt(i)!= str.charAt(j)){
j = next[j-1];
}
if(str.charAt(i)== str.charAt(j)){
j++;
}
next[i]=j;
}
}
}
字符串匹配,1、暴力匹配,2、kmp匹配
最新推荐文章于 2024-04-11 21:53:49 发布