首页 > 编程语言 >暴力匹配算法、KMP算法

暴力匹配算法、KMP算法

时间:2022-10-01 10:33:45浏览次数:53  
标签:暴力 int str2 str1 next dest 算法 KMP charAt

  • 应用实例
  • 暴力匹配算法、KMP算法_i++

  • 暴力匹配算法
  • 暴力匹配算法、KMP算法_i++_02

  • 代码实现
public class ViolenceMatch {

public static void main(String[] args) {
//测试暴力匹配算法
String str1 = "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";
String str2 = "尚硅谷你尚硅你~";
int index = violenceMatch(str1, str2);
System.out.println("index=" + index);
}

// 暴力匹配算法实现
public static int violenceMatch(String str1, String str2) {
char[] s1 = str1.toCharArray();
char[] s2 = str2.toCharArray();

int s1Len = s1.length;
int s2Len = s2.length;

int i = 0; // i索引指向s1
int j = 0; // j索引指向s2
while (i < s1Len && j < s2Len) {// 保证匹配时,不越界
if(s1[i] == s2[j]) {//匹配ok
i++;
j++;
} else { //没有匹配成功
//如果失配(即str1[i]! = str2[j]),令i = i - (j - 1),j = 0。
i = i - (j - 1);
j = 0;
}
}

//判断是否匹配成功
if(j == s2Len) {
return i - j;
} else {
return -1;
}
}

}
  • ​KMP算法​
  • 根据部分匹配表移动位置
  • 如果是暴力匹配算法,移动1位
  • 暴力匹配算法、KMP算法_i++_03

  • 如果是KMP算法,则是移动4位
  • 暴力匹配算法、KMP算法_kmp算法_04

  • 部分匹配表
  • 暴力匹配算法、KMP算法_i++_05

暴力匹配算法、KMP算法_数据结构与算法_06

暴力匹配算法、KMP算法_kmp算法_07

  • 代码实现
public class KMPAlgorithm {

public static void main(String[] args) {
String str1 = "BBC ABCDAB ABCDABCDABDE";
String str2 = "ABCDABD";

int[] next = kmpNext("ABCDABD"); //[0, 1, 2, 0]
System.out.println("next=" + Arrays.toString(next));

int index = kmpSearch(str1, str2, next);
System.out.println("index=" + index); // 15了
}

//写出我们的kmp搜索算法
/**
* @param str1 源字符串
* @param str2 子串
* @param next 部分匹配表, 是子串对应的部分匹配表
* @return 如果是-1就是没有匹配到,否则返回第一个匹配的位置
*/
public static int kmpSearch(String str1, String str2, int[] next) {
//遍历
for(int i = 0, j = 0; i < str1.length(); i++) {
//需要处理 str1.charAt(i) != str2.charAt(j), 去调整j的大小
//KMP算法核心点, 可以验证...
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()) {//找到了 // j = 3 i
return i - j + 1;
}
}
return -1;
}

//获取到一个字符串(子串) 的部分匹配值表
public static int[] kmpNext(String dest) {
//创建一个next 数组保存部分匹配值
int[] next = new int[dest.length()];
next[0] = 0; //如果字符串是长度为1 部分匹配值就是0
for(int i = 1, j = 0; i < dest.length(); i++) {
//当dest.charAt(i) != dest.charAt(j) ,我们需要从next[j-1]获取新的j
//直到我们发现 有 dest.charAt(i) == dest.charAt(j)成立才退出
//这时kmp算法的核心点
while(j > 0 && dest.charAt(i) != dest.charAt(j)) {
j = next[j-1];
}
//当dest.charAt(i) == dest.charAt(j) 满足时,部分匹配值就是+1
if(dest.charAt(i) == dest.charAt(j)) {
j++;
}
next[i] = j;
}
return next;
}

}



标签:暴力,int,str2,str1,next,dest,算法,KMP,charAt
From: https://blog.51cto.com/chniny/5728147

相关文章

  • 动态规划算法
    应用实例有一个背包,容量为4磅,现在将如下商品装入背包,要求装入的背包的总价值最大,并且重量不超出,且物品不能重复#当前为01背包#如果为完全背包则放入物品可重复简介思路分......
  • 非递归的方式实现二分查找算法
    简介二分查找法的运行时间为对数时间O(㏒₂n),即查找到需要的目标位置最多只需要㏒₂n步,假设从[0,99]的队列(100个数,即n=100)中寻到目标数30,则需要查找步数为㏒₂100,即最......
  • React面试:谈谈虚拟DOM,Diff算法与Key机制
    1.虚拟dom原生的JSDOM操作非常消耗性能,而React把真实原生JSDOM转换成了JavaScript对象。这就是虚拟Dom(VirtualDom)每次数据更新后,重新计算虚拟Dom,并和上一次生成的虚拟......
  • LeetCode 无重复字符的最长子串算法题解 All In One
    LeetCode无重复字符的最长子串算法题解AllInOnejs/ts实现无重复字符的最长子串无重复字符的最长子串原理图解滑动窗口"usestrict";/****@authorx......
  • Python基本算法实现及总结归纳
    @目录冒泡排序快速排序插入排序选择排序希尔排序归并排序各个算法的时间复杂度附:二分法冒泡排序这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(......
  • 传统优化方法:枚举法、启发式算法和搜索算法
    1.枚举法枚举出可行解集合内的所有可行解,以求出精确最优解。对于连续函数,该方法要求先对其进行离散化处理,这样就可能因离散处理而永远达不到最优解。当枚举空间比较大时......
  • PTA 21级数据结构与算法实验5—树和二叉树
    目录7-1还原二叉树7-2朋友圈7-3修理牧场7-4玩转二叉树7-5根据后序和中序遍历输出先序遍历7-6完全二叉树的层序遍历7-7列出叶结点7-8部落7-9建立与遍历二叉树7-10......
  • 基于微粒群算法的0-1背包问题求解
    importrandomimportmathimportmatplotlib.pyplotaspltimportnumpyasnpimporttimedefinit(b_=700,xSize_=200,iteration_=1000,c1_=0.5,c2_=0.5,w_=0.8):......
  • Raft 共识算法
    转载请注明出处:https://www.cnblogs.com/morningli/p/16745294.htmlraft是一种管理复制日志的算法,raft可以分解成三个相对独立的子问题:选主(Leaderelection):原有的lead......
  • 通关基本算法 day_10 -- 区间合并
    区间合并给我们很多很多区间,这两个区间有交集,我们合并成一个区间例如[1,9]和[3,13]可以合并为[1,13]原理按所有区间的左端点排序扫描整个区间,把所有可能有交点......