zoukankan      html  css  js  c++  java
  • KMP算法(java,c++)

    java

    public class KMP {
        public static int[] getNextArray(char[] t) {
            int[] next = new int[t.length];
            next[0] = -1;
            next[1] = 0;
            int k;
            for (int j = 2; j < t.length; j++) {
                k=next[j-1];
                while (k!=-1) {
                    if (t[j - 1] == t[k]) {
                        next[j] = k + 1;
                        break;
                    }
                    else {
                        k = next[k];
                    }
                    next[j] = 0;  //当k==-1而跳出循环时,next[j] = 0,否则next[j]会在break之前被赋值
                }
            }
            return next;
        }
        public static int kmpMatch(String s, String t){
            char[] s_arr = s.toCharArray();
            char[] t_arr = t.toCharArray();
            int[] next = getNextArray(t_arr);
            int i = 0, j = 0;
            while (i<s_arr.length && j<t_arr.length){
                if(j == -1 || s_arr[i]==t_arr[j]){
                    i++;
                    j++;
                }
                else
                    j = next[j];
            }
            if(j == t_arr.length)
                return i-j;
            else
                return -1;
        }
    
        public static void main(String[] args) {
            System.out.println(kmpMatch("abcabaabaabcacb", "abaabcac"));
        }
    
    }

     c++

    #include <iostream>
    #include <string>
    
    using namespace std;
    int next[8];
    /*求单个回溯值
    int GetNext(int j,char T[])
    {
        if(j==0) return -1;
        if(j>0)
        {
            int k=GetNext(j-1,T);
            while (k>=0)
                if(T[j-1]==T[k]) return k+1;
                else k=GetNext(k,T);
            return 0;
        }
        return 0;
    }*/
    void GetNext(char T[])
    {
        int j=0,k=-1;next[j]=k;
        while (T[j]!='')
            if(k==-1 || T[j]==T[k])
            {j=j+1;k=k+1;next[j]=k;}
            else k=next[k];
    }
    int KMP(char S[],int start,char T[])
    {   int i=start,j=0;
        while (S[i]!=''&&T[j]!='')
        if(j==-1||S[i]==T[j])
            {i=i+1;j=j+1;}
        else j=next[j];
        if(T[j]=='') return(i-j);
        else return(-1);
    
    }
    
    
    
    int main()
    {   //字符数组检测不到""
        //char S[]={'d','f','g','a','b','a','a','b','c','a','c','f'};
        //char T[]={'a','b','a','a','b','c','a','c'};
        char S[]="gfylaa45e4daabaabcac";
        char T[]="abaabcac";
        GetNext(T);
        for(int i=0;i<8;i++)
            cout<<next[i]<<' ';
        cout<<endl;
        cout<<KMP(S,0,T)<<endl;
    
    
        return 0;
    
    }
  • 相关阅读:
    js设置、修改、获取、删除 cookie
    mysql排序让空值NULL排在数字后边
    javascript的函数作用域及声明提前
    修改mysql的密码
    解决thinkphp设置session周期无效的问题
    filter_var() 验证邮箱、ip、url的格式 php
    将中文字符串分割为数组 解决str_split中文乱码php
    生成多个不重复的随机数字php
    javascript控制input只允许输入数字
    推荐开发工具系列之--Clover(文件浏览器)
  • 原文地址:https://www.cnblogs.com/cky-2907183182/p/10885441.html
Copyright © 2011-2022 走看看