B站学习传送门–>尚硅谷Java数据结构与java算法(Java数据结构与算法)
KMP算法这部分看视频讲解的话,还不是很清楚,根据尚硅谷数据结构视频中的推荐,找到这篇很全面的文章—> 推荐看大佬的文章–>从头到尾彻底理解KMP
在B站找到一个KMP算法的讲解视频也不错;—>视频链接地址 KMP算法之求next数组代码讲解
1.情景引入
关于字符串的匹配问题;
主字符串1 —> str1 = " 我是一条很长的字符串我是被匹配的字符串 " ; 字符串2 —> str2= " 被匹配的 "; 若字符串1包含字符串2,则返回开始出现的位置;否则返回 -1;
若使用暴力匹配的方式,需要依次寻找是否存在;
假如父级字符串 str1 有个指针 i ; 子级字符串 str2 有个指着 j; (1)当 str1.charAt( i ) == str2.charAt( j ) ;i+=1;j+=1,两个字符串的指针均向后移动; (2)若当前不相等时,则需要将子级字符串str2的 指针 j 归零 ; 然后是字符串str1的指针需要回溯: i=i-(j-1)
2.暴力匹配字符串方法实现
public class ViolentTest {
public static void main(String[] args) {
String faStr = "我是一条很长的字符串我是被匹配的字符串";
String sonStr = "被匹配的";
System.out.println("--若匹配则显示首次出现的位置,否则返回-1---");
System.out.println(violentMethod(faStr, sonStr));
}
public static int violentMethod(String fa, String son) {
int faLen = fa.length();
int sonLen = son.length();
char[] faArray = fa.toCharArray();
char[] sonArray = son.toCharArray();
int pointerFa = 0;
int pointerSon = 0;
while (pointerFa < faLen && pointerSon < sonLen) {
if (faArray[pointerFa] == sonArray[pointerSon]) {
pointerFa++;
pointerSon++;
} else {
pointerFa = pointerFa - (pointerSon - 1);
pointerSon = 0;
}
}
if (pointerSon == sonLen) {
return pointerFa - pointerSon;
} else {
return -1;
}
}
}
3. KMP匹配算法
这部分看视频讲解的话,还不是很清楚,根据视频的推荐,找到这篇很全面的文章—> 推荐看大佬的文章–>从头到尾彻底理解KMP
在B站找到一个KMP算法的讲解视频也不错;—>视频链接地址 KMP算法之求next数组代码讲解
package day19kmpalgorithm;
import java.util.Arrays;
public class KmpTest {
public static void main(String[] args) {
String fa = "ZXCV QQWERTY QQWEKQQWEQQWERTYUQWER";
String son = "QQWERTYU";
int[] sonNext = kmp(son);
System.out.println(Arrays.toString(sonNext));
System.out.println("出现的位置"+kmpMethod(fa, son, sonNext));
}
private static int kmpMethod(String fa,String son,int[] sonNext){
for (int i1 = 0,i2 =0; i1 < fa.length(); i1++) {
while(i2>0 && fa.charAt(i1)!=son.charAt(i2)){
i2 = sonNext[i2-1];
}
if(fa.charAt(i1) == son.charAt(i2)){
i2++;
}
if(i2 == son.length()){
return i1-i2 +1;
}
}
return -1;
}
private static int[] kmp(String son){
int[] next = new int[son.length()];
next[0]=0;
for (int i = 1, j=0; i < son.length() ; i++) {
while(j>0 && son.charAt(i)!=son.charAt(j)){
j = next[j-1];
}
if(son.charAt(i)==son.charAt(j)){
j++;
}
next[i]=j;
}
return next;
}
}
|