zoukankan      html  css  js  c++  java
  • Java数据结构之字符串模式匹配算法---KMP算法2

    直接接上篇上代码:

     1 //KMP算法
     2 public class KMP {
     3 
     4     // 获取next数组的方法,根据给定的字符串求
     5     public static int[] getNext(String sub) {
     6 
     7         int j = 1, k = 0;
     8         int[] next = new int[sub.length()];
     9         next[0] = -1; // 这个是规定
    10         next[1] = 0; // 这个也是规定
    11         //
    12         while (j < sub.length() - 1) {
    13             if (sub.charAt(j) == sub.charAt(k)) {
    14                 next[j + 1] = k + 1;
    15                 j++;
    16                 k++;
    17             } else if (k == 0) {
    18                 next[j + 1] = 0;
    19                 j++;
    20             } else {
    21                 k = next[k];
    22             }
    23 
    24         }
    25         return next;
    26     }
    27 
    28     // 根据给定的主串和子串,采用KMP算法来获取模式匹配
    29     public static int kmp(String src, String sub) {
    30 
    31         // 首先生成模式串sub的next[j]
    32         int[] next = getNext(sub);
    33         int i = 0, j = 0, index = -1;
    34         while (i < src.length() && j < sub.length()) {
    35             if (src.charAt(i) == sub.charAt(j)) {
    36                 i++;
    37                 j++;
    38             } else if (j == 0) {
    39                 i++;
    40             } else {
    41                 j = next[j];
    42             }
    43         }
    44 
    45         // 得到开始匹配的位置索引
    46         if (j == sub.length()) {
    47             index = i - sub.length();
    48         }
    49         return index;
    50     }
    51 }

    //

     1 //KMP算法的测试
     2 public class Test {
     3     /**
     4      * @param args
     5      */
     6     public static void main(String[] args) {
     7         String src = "aaaaaaab";
     8         String sub = "ABCDABDABD";
     9         int[] next = KMP.getNext(sub);
    10         //int[] next = lengthKMP(sub.toCharArray());
    11         for (int i : next) {
    12             System.out.print(i + "  ");// -1 0 1 2 3
    13         }
    14 
    15         // System.out.println();
    16         // System.out.println(KMP.kmp(src, sub));
    17     }
    18 
    19     //补充上一篇中的对于前缀后缀的讨论的获取部分匹配数组的算法
    20     public static int[] lengthKMP(char[] mchar) {
    21         int[] fixNum = new int[mchar.length];
    22         for (int i = 1, j = 0; i < mchar.length; i++) {
    23             if (mchar[j] == mchar[i]) {
    24                 fixNum[i] = j + 1;
    25                 j++;
    26             } else if (j > 0) {
    27                 j = 0;
    28                 i -= j;
    29             }
    30         }
    31         // return [0, 0, 0, 0, 1, 2, 0, 1, 2, 0]ABCDABDABD
    32         return fixNum;
    33     }
    34 }
  • 相关阅读:
    在IIS上部署 .Net Core 3.0 项目踩坑实录
    .net core3.0部署Linux服务器 使用Docker容器和Nginx反代理教程
    播放器 AxWindowsMediaPlayer控件的使用
    Github下载慢和下载过程中断等情况的解决方案
    GitHub第一次上传遇到的问题
    DataGridView && 增加复选框(checkbox)方法
    努力
    绘图:drawImage一个用法
    Tuple<T1,T2,.........T> 元组简单使用
    随机的标识符GUID
  • 原文地址:https://www.cnblogs.com/fuck1/p/6059804.html
Copyright © 2011-2022 走看看