avatar

java实现字符串匹配(暴力匹配和kmp算法)

暴力匹配

package com.csw.algorithm.kmp;

/**
* @Auther: 行路
* @Date: Created on 2020/5/5 16:19 星期二
* @Description: com.csw.algorithm.kmp
* @version: 1.0 暴力匹配
*/
public class ViolenceMatch {
public static void main(String[] args) {
//测试暴力匹配算法
String str1="硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";
String str2="尚硅谷你尚硅你";
int index=violenceMatch(str1,str2);
System.out.println(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;
// i索引,j索引
int i=0;
int j=0;
while (i<s1Len&&j<s2Len){
//保证匹配时,不越界
if(s1[i]==s2[j]){
i++;
j++;
}else{
//没有匹配成功
i=i-(j-1);
j=0;
}
}
//判断是否匹配成功
if(j==s2Len){
return i-j;
}else{
return -1;
}
}
}

kmp算法

package com.csw.algorithm.kmp;

import java.util.Arrays;

/**
* @Auther: 行路
* @Date: Created on 2020/5/5 16:51 星期二
* @Description: com.csw.algorithm.kmp
* @version: 1.0 kmp算法
*/
public class KMPAlgorithm {
public static void main(String[] args) {
String str1 = "BBC ABCDAB ABCDABCDABDE";
String str2 = "ABCDABD";
int[] next=KmpNext("ABCDABD");
System.out.println(Arrays.toString(next));
int index=kmpSearch(str1,str2,next);
System.out.println("index="+index);
}



/**
* 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()){
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)满足时,才退出
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;

}
}
文章作者: Todcsw
文章链接: https://todcsw.github.io/2020/05/05/dataStructure-java%E5%AE%9E%E7%8E%B0%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%B9%E9%85%8D-%E6%9A%B4%E5%8A%9B%E5%8C%B9%E9%85%8D%E5%92%8Ckmp%E7%AE%97%E6%B3%95/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 行路のblog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论