KMP算法

KMP算法

数据结构整理目录>>>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0FXLFyGV-1579000190414)(images/06.png)]

暴力匹配算法

思路

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-shTgNdVG-1579000190416)(images/07.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ESIqm6Hd-1579000190417)(images/08.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jCgjKQTP-1579000190418)(images/09.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gQd8GhND-1579000190419)(images/10.png)]

代码

    package L十大算法.StringMatch;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/1/14 0014  16:04
 * 字符串暴力匹配算法
 */
public class BaoLiMatch {

    public static void main(String[] args) {

        String str1 = "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅你尚硅你好";
        String str2 ="尚硅谷你尚硅你";

        System.out.println(baoliMatch(str1,str2));

    }

    /**
     *
     * @param str1 带匹配的字符串
     * @param str2 模式串
     * @return
     */
    public static int baoliMatch(String str1,String str2){

        int i =0; //带匹配的字符串的指针索引
        int j =0 ; 

            while(true){
                //假如当前指针下的字符相等
                if(str1.substring(i,i+1).equals(str2.substring(j,j+1))) {
                    i++; //不断匹配下一个字符
                    j++;
                    if (j == str2.length()) { //当j遍历到str2队尾则说明找到,结束
                        return i - j;
                    }
                }else{
                    //当j大于str2长度或者指针中i大于j则说明出现错误
                    if(j>=str2.length()||i>j){
                        return -1;
                    }
                    i = i-j+1;//当前字符不匹配则 str1回溯到这次遍历起点处的下一个指针处
                    j=0; //str2职位0从str2的起点处重新匹配
                }
            }

    }



}
        

存在问题

  1. 回溯效率较低

KMP算法简介

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4DgValB8-1579000190420)(images/11.png)]

思路

很详尽KMP算法推导过程

很详尽KMP算法推导过程

很详尽KMP算法推导过程

很详尽KMP算法推导过程

很详尽KMP算法推导过程

代码

package L十大算法.StringMatch;

import java.util.Arrays;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/1/14 0014  18:30
 */
public class KMPAlgrothim {

    public static void main(String[] args) {
        String str1 ="BBC ABCDAB ABCDABCDABDE";
        String str2 = "ABCDABCD";
        int[] next = KmpNext("ABCDABD");
        System.out.println(Arrays.toString(next));

        System.out.println(kmpSearch(str1,str2,next));
    }

    /**
     *
     * @param str1 大串
     * @param str2 匹配模式
     * @param next 部分匹配表,str2
     * @return
     */
    //写出KMP搜索算法
    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)
            //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)){
                //这是KMP算法的核心点
                j = next[j-1];
            }

            //当dest.charAt(i) == dest.charAt(j)满足时,部分匹配值即使+1
            if(dest.charAt(i)==dest.charAt(j)){
                j++;
            }
            next[i]=j;
        }
        return next;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值