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

暴力匹配算法、KMP算法

时间:2022-09-27 17:45:23浏览次数:53  
标签:匹配 暴力 int str2 next dest 算法 KMP charAt

  • 应用实例

  • 暴力匹配算法

  • 代码实现

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算法,则是移动4位

  • 部分匹配表

  • 代码实现
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,next,dest,算法,KMP,charAt
From: https://www.cnblogs.com/chniny/p/16735361.html

相关文章

  • MD5 加密算法 All In One
    MD5加密算法AllInOneMD5算法是Hash算法的一种,叫做讯息摘要算法Message-DigestAlgorithm/消息摘要算法https://zh.wikipedia.org/wiki/MD5https://en.wikipe......
  • 动态规划算法
    应用实例有一个背包,容量为4磅,现在将如下商品装入背包,要求装入的背包的总价值最大,并且重量不超出,且物品不能重复#当前为01背包#如果为完全背包则放入物品可重复......
  • 雪花算法导致前端精度丢失的配置
    步骤一:importcom.fasterxml.jackson.databind.DeserializationFeature;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.fasterxml.jackson.databind.mo......
  • CF494B Obsessive String KMP+前缀和优化DP
    给一份看起来字数比较少的题解?题意给一个字符串\(s\),和一个字符串\(t\)。在\(s\)中取出任意多个不重叠的子串(可以有子串没有被取出),使得每个子串都包含\(t\),求方案......
  • 通关基本算法 day_08 -- 位运算
    求整数n二进制表示里,第k位数字是几?$$n=15=(1111)_2$$先把第k位移到最后一位n>>k看个位是几x&1总结:n>>k&1例子例如输出10的二进制表达#includ......
  • 分治算法
    简介把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧......
  • 基础算法脚本
    将字符串翻转:functionreverseString(str){//法一:/*letarr=[];for(leti=0;i<str.length;i++){arr.unshift(str[i]);}//console.log(arr);//[......
  • 计算空间物体包围球的两种算法实现_charlee44的博客
    1.概述在进行二维空间几何运算的之前,往往会用包围盒进行快速碰撞检测,从而筛掉一些无法碰撞到的可能。而在三维中,比较常用的就是包围球了。当然,如何计算包围球是一个问题......
  • 力扣算法第1题--两数之和(暴力题解&优化题解)
    两数之和题目描述:给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输......
  • Java实现SHA1单向加密算法
    importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;publicclassSha1Util{publicStringsha1(Stringdata)throwsNoSuch......