zoukankan      html  css  js  c++  java
  • 【模式匹配】— KMP变形

    求STR中所有的匹配sub位置,和基本KMP略有不同

    package base;
    
    //O(m+n) 时间复杂度 KMP主要是求Next数组 
    public class KMP {
    
        public static int[] next(String sub) {
            int[] a = new int[sub.length()];
           char[] c = sub.toCharArray();
            int length=sub.length();
            int i,j;
            a[0] = -1;
            i = 0;
           for(j=1;j<length;j++) {
               i = a[j - 1];
               while(i>=0&&c[j]!=c[i+1]) {
                   i = a[i];    
               }
              if(c[j]==c[i+1]) {
                  a[j] = i+1;
              }
              else {
                  a[j] = -1;
              }
           }
           return a;
       }
        
        public static void pattern(String str,String sub,int[] next) {          
            char[] ch1 = str.toCharArray();           
            char[] ch2 = sub.toCharArray();           
            int i = 0,j = 0;  // i控制ch1,j控制ch2;
             for(;i<ch1.length;) {
                 if(ch1[i]==ch2[j]){// 匹配就自动递增,往后匹配。
                     if(j==ch2.length-1){
                         System.out.println(i-ch2.length+1);
                         break;
                     }
                     j++;
                     i++;
                 }
                 else if(j==0){
                         i++;
                 }
                else{ 
                    j=next[j-1]+1;
                }
            }
        }
                                                                                                                                                                                            
        
        public static void main(String[] args) {
            
            String sub = "ababca";        
            String str = "bababcababababcabab";        
            int[] next = next(sub);
            pattern(str,sub,next);
        }
    }
  • 相关阅读:
    作业6
    作业8
    作业7
    作业5
    作业4
    作业3
    作业2
    作业1
    浏览器跨域的细节
    解析node-cors模块
  • 原文地址:https://www.cnblogs.com/lixusign/p/2464898.html
Copyright © 2011-2022 走看看