zoukankan      html  css  js  c++  java
  • 字符串匹配算法

    //思路一:时间复杂度为O(mn),返回第一个找到的匹配的下标。如果找不到匹配的结果,那么返回
    public class MatchString {
       public int matchString(char[] old,char[] now,int pos){
           //返回第pos个元素开始的子串的第一个匹配的字符串。
           if(old==null||now==null)
               return -1;
           int len1=old.length;
           int len2=now.length;
           int i=pos,j=0;
           while((i+j)<len1&&j<len2){
               if(old[i+j]==now[j])
                   j++;
               else{
                   i++;
                   j=0;
               }
           }
           if(j!=len2)
               return -1;
           
           return i;
       }
       public static void main(String[] args){
           String a="afghghj";
           char[] old=a.toCharArray();
           String b="gh";
           char[] now=b.toCharArray();
           MatchString matchString=new MatchString();
           int pos=matchString.matchString(old, now,0);
           System.out.println(pos);
       }
    }

    KMP算法

    /*定义:
    
    (1)next[0]= -1 意义:任何串的第一个字符的模式值规定为-1。
    (2)next[j]= -1   意义:模式串T中下标为j的字符,如果与首字符
    相同,且j的前面的1—k个字符与开头的1—k
    个字符不等(或者相等但T[k]==T[j])(1≤k<j)。
    如:T=”abCabCad” 则 next[6]=-1,因T[3]=T[6]
    (3)next[j]=k    意义:模式串T中下标为j的字符,如果j的前面k个
    字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)。
                           即T[0]T[1]T[2]。。。T[k-1]==
    T[j-k]T[j-k+1]T[j-k+2]…T[j-1]
    且T[j] != T[k].(1≤k<j);
    (4) next[j]=0   意义:除(1)(2)(3)的其他情况。*/
    /*意义:
     next 函数值究竟是什么含义,前面说过一些,这里总结。
    设在字符串S中查找模式串T,若S[m]!=T[n],那么,取T[n]的模式函数值next[n],
    1.       next[n]= -1 表示S[m]和T[0]间接比较过了,不相等,下一次比较 S[m+1] 和T[0]
    2.       next[n]=0 表示比较过程中产生了不相等,下一次比较 S[m] 和T[0]。
    3.       next[n]= k >0 但k<n, 表示,S[m]的前k个字符与T中的开始k个字符已经间接比较相等了,下一次比较S[m]和T[k]相等吗?
    4.       其他值,不可能。*/
    public class KMP {
        public int indexKMP(String old,String now,int pos){
            if(old==null||now==null)
                return -1;
            char[] oldStr=old.toCharArray();
            char[] nowStr=now.toCharArray();
            int len1=oldStr.length;
            int len2=nowStr.length;
            int[] next=getNext(now);
            int j=0;
            int i=pos;
            while(i<len1){
                if(j==-1||oldStr[i]==nowStr[j]){
                    i++;
                    j++;    
                }
                else
                    j=next[j];//回退的位置。
                if(j==len2)
                    return j-i;
                }
            return -1;
        }
        public int[] getNext(String s){
            char[] chars=s.toCharArray();
            int len=chars.length;
            int[] next=new int[len];
            next[0]=-1;//第一个数默认为-1;
            int k=-1;
            int i=0;
            while(i<len-1){
                if(k==-1||chars[k]==chars[i]){
                    k++;
                    i++;
                    if(chars[k]!=chars[i])
                        next[i]=k;
                    else
                        next[i]=next[k];//当后面一个数和前面一个数相同的时候
                }
                else
                    // 比较到第K个字符,说明p[0——k-1]字符串和p[j-k——j-1]字符串相等,而next[k]表示
                    // p[0——k-1]的前缀和后缀的最长共有长度,所接下来可以直接比较p[next[k]]和p[j]
                    k=next[k];
            }
            return next;
        }
        public static void main(String[] args){
            String s="abcabd";
            String s1="aacaad";
            String s2="aaaaad";
            String old="ietoerabcabddkd";
            int[] a=new int[s.length()];
            KMP kmp=new KMP();
            a=kmp.getNext(s);
            int index=kmp.indexKMP(old, s, 0);
            for(int i:a){
                System.out.print(i+" ");
            }
            System.out.println(index);
        }
    }
  • 相关阅读:
    42、lucene和机器学习进行全文搜索,并排序
    41、javaMail机制
    40、dom以xml结尾的文件
    39、重新复习js之三
    38、重新复习javascript之三
    36、重新复习html和css之二
    35、重新复习html与css(1)
    34、Shiro框架入门三,角色管理
    33、插入一段大学学的计算机,正儿八经的计算机图形学
    32、shiro框架入门3.授权
  • 原文地址:https://www.cnblogs.com/hupp/p/4831941.html
Copyright © 2011-2022 走看看