算法-KMP匹配

下面是原码

BF暴力匹配

 public static int BF(String str1,String str2){
        /**
         * 这个其实就是我们的暴力匹配的算法,就是进行同步增加匹配,如果匹配不成功就把 j == 0; i == i - j + 1;
         */

        //这个其实我们这样写的好处还有一个就是以后不用在进行函数的调用消耗我们的内存
        int m = str1.length();
        int n = str2.length();

        int i = 0;//这个是我们主串的遍历位置
        int j = 0;//这个是我们字串的遍历位置

        while(i < m && j < n){
            if(str1.charAt(i) == str2.charAt(j)){
                i++;
                j++;
            }else{
                i = i - j + 1;//这里为什么置为这个数值是因为我们的i 跟 j 是同步变化的(下次便利的时候更换起点为这个值)
                j = 0;
            }
        }
        if(j == n){
            return i - j;
        }
        return -1;
    }

KMP算法

public static int[] getNext(String s,int strlen){
        int[] next = new int[strlen];
        if(strlen == 1){
            return new int[]{-1};
        }
        next[0] = -1;
        next[1] = 0;
        int cn = 0;// cn 就是我们的需要next数组的下标值前一个要比较的下标
        int i = 2;// i 就是我们需要的next数组的值的下标,(起始位置就是我们的2)
        while(i < strlen){
            if(s.charAt(i-1)==s.charAt(cn)){
                next[i++] = ++cn;
            }else if(cn > 0){
                cn = next[cn];
            }else{
                next[i++] = 0;
            }
        }
        return next;
    }

    public static int KMP(String str1,String str2){
        int m = str1.length();
        int n = str2.length();
        int[] next = getNext(str2,n);
        int i = 0;
        int j = 0;
        while(i < m && j < n){
            if(str1.charAt(i) == str2.charAt(j)){
                i++;
                j++;
            }else if(j == 0){
                i++;
            }else{
                j = next[j];
            }
        }
        return j == m ? i - j : -1;
    }

暴力求解我们next数组

public static int[] conNextArray(String str){
        int[] arr = new int[str.length()];
        arr[0] = -1;
        arr[1] = 0;
        for(int i = 2; i < str.length(); ++i){
            int count = 0;
            int flag = 0;
            for(int j = i - 1; j > 0; --j){
                if(str.substring(0,j).equals(str.substring(i - j, i))){
                    if(flag != 1){
                        arr[i] = j;
                        flag = 1;
                        break;
                    }
                }
            }
        }
        return arr;
    }

相关推荐

  1. 算法-KMP匹配

    2024-03-17 19:00:04       19 阅读
  2. 使用verillog编写KMP字符串匹配算法

    2024-03-17 19:00:04       19 阅读
  3. 7-17 KMP模式匹配算法

    2024-03-17 19:00:04       11 阅读
  4. 串2 串的模式匹配算法KMP

    2024-03-17 19:00:04       9 阅读
  5. KMP算法

    2024-03-17 19:00:04       51 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-17 19:00:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-17 19:00:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-17 19:00:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-17 19:00:04       20 阅读

热门阅读

  1. 【亲测可行】Mac上clion boost库的安装与使用

    2024-03-17 19:00:04       19 阅读
  2. php反序列化及其常见魔术方法及其触发条件

    2024-03-17 19:00:04       19 阅读
  3. mysql备份

    2024-03-17 19:00:04       18 阅读
  4. logrotate 日志文件管理工具介绍和经典案例

    2024-03-17 19:00:04       21 阅读
  5. 【MySQL】GROUP_CONCAT 运用易错点之建立方程

    2024-03-17 19:00:04       23 阅读
  6. kubeadm部署Kubernetes(k8s) 1.23.0高可用集群

    2024-03-17 19:00:04       22 阅读