学习数据结构笔记(18) --- [KMP算法]
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习数据结构笔记(18) --- [KMP算法]相关的知识,希望对你有一定的参考价值。
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));
//--若匹配则显示首次出现的位置,否则返回-1---
//12
//暴力匹配算法;
public static int violentMethod(String fa, String son)
//获取父级,子级字符串的长度;
int faLen = fa.length();
int sonLen = son.length();
//父子级字符串变换的数组;
char[] faArray = fa.toCharArray();
char[] sonArray = son.toCharArray();
//定义在父级和子级字符串的指针; pointerFa pointerSon
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;
/**
* @author by CSDN@小智RE0
*/
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));
//[0, 1, 0, 0, 0, 0, 0, 0]
//出现的位置22
//进行搜索;
private static int kmpMethod(String fa,String son,int[] sonNext)
//i1匹配父字符串,i2匹配子字符串;
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()];
//长度为1,则匹配对应为0;
next[0]=0;
for (int i = 1, j=0; i < son.length() ; i++)
//等待相等时再退出while循环;
while(j>0 && son.charAt(i)!=son.charAt(j))
j = next[j-1];
//i一开始在字符串第2位, 前后的字符相等;j后移;
if(son.charAt(i)==son.charAt(j))
j++;
//更新匹配数组;
next[i]=j;
return next;
以上是关于学习数据结构笔记(18) --- [KMP算法]的主要内容,如果未能解决你的问题,请参考以下文章