zoukankan      html  css  js  c++  java
  • java

    代码很简单,主要是思路可能会有点绕- -|||

    reference:

    https://www.bilibili.com/video/av54029771?p=162

    package search;
    
    public class MatchString {
        public static void main(String[] args){
            String str1 = "abc babd abcdabcd abcdabdcde";
            String str2 = "abcdabd"; //寻找str2 在str1中第一次出现的位置
    
            System.out.println(kmp(str1, str2));
            System.out.println(str1.charAt(kmp(str1,str2)));
    
        }
    
        public static int kmp(String str1, String str2){
    
            int[] mt = matchTable(str2);
            char[] cArr1 = str1.toCharArray();
            char[] cArr2 = str2.toCharArray();
    
            for(int i = 0, j = 0; i < str1.length(); i++ ){
                if(cArr1[i] == cArr2[j]){
                    j++;
                }
                else{
                    j = mt[j];
                }
    
                if(j == str2.length()){  //因为最后一个匹配成功后,j++了,所以这里是j = length()
                    return i - str2.length() + 1;  //i此时指向了匹配成功的字符串的最后一个字符,所以要向前移动字符串长度 - 1 距离指向第一个字符,然后返回
                }
            }
    
            return -1;
        }
    
    
        public static int[] matchTable(String str){ //建立匹配表
            char[] cArr = str.toCharArray();
            int[] mt = new int[str.length()];
            mt[0] = 0;
            for(int i = 1, j = 0; i < cArr.length; i++){
                mt[i] = 0;
                if(cArr[i] == cArr[j]){
                    j++;
                }
                else{
                    j = 0;
                }
                mt[i] = j;
            }
    
            for(int i = 0; i < mt.length; i++){
                System.out.print(mt[i] + " ");
            }
            System.out.println();
            return mt;
        }
    }
  • 相关阅读:
    psi
    firefox修改语言
    automapper
    堆喷图解
    脱壳系列_0_FSG壳_详细版
    脱壳系列_1_UPX壳_详细版
    算法01-最大子数组详解
    逆向MFC程序
    如何执行shell命令
    Unity之流光效果
  • 原文地址:https://www.cnblogs.com/clamp7724/p/11881486.html
Copyright © 2011-2022 走看看