/**
 * Java实现KMP算法
 *  
 * 思想:每当一趟匹配过程中出现字符比较不等,不需要回溯i指针,  
 * 而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远  
 * 的一段距离后,继续进行比较。
 *  
 * 时间复杂度O(n+m)
 *  
 */  
public class KMP {

//通过计算返回字串t的next数组
    public int[] get_next(char[] t){
        int lengthT = t.length;
        int[] next = new int[lengthT];
        next[0] = -1;
        int i = 0;
        int j = -1;
        while(i < lengthT-1){
            //t.charAt(i)表示后缀的单个字符,t.charAt(j)表示前缀的单个字符
            if(j == -1 || t[i] == t[j]){
                ++i;
                ++j;
                next[i] = j;
            }else{
                //若字符不相同,则j值回溯
                j = next[j];
            }
        }
        return next;
    }
    //改进版求next
    public int[] get_nextval(char[] t){
        int[] nextval = new int[t.length];
        nextval[0] = -1;
        int i = 0;
        int j = -1;
        while(i < t.length - 1){
            if(j == -1 || t[i] == t[j]){
                ++i;
                ++j;
                if(t[i] != t[j]){
                    nextval[i] = j;
                }else{
                    nextval[i] = nextval[j];
                }
            }else{
                j = nextval[j];
            }
        }
        return nextval;
    }
    //s是主串,t是子串,匹配成功返回下标,匹配不成功返回-1
    public int kmp_Index(char[] s, char[] t){
        int[] next = get_nextval(t);
        int i = 0;
        int j = 0;
        while(i <= s.length - 1 && j <= t.length - 1){
            if(j == -1 || s[i] == t[j]){
                ++i;
                ++j;
            }else{
                j = next[j];
            }
        }
        if(j < t.length){
            return -1;
        }else{
            return i - t.length;
        }
            
        
    }
    public static void main(String[] args) {
        KMP kmp = new KMP();
        String s = "abbabbbbcab";
        String ss = "babbb";
        char[] s1 = s.toCharArray();
        char[] ss1 = ss.toCharArray();
        System.out.println(kmp.kmp_Index(s1, ss1));;
        
    }
}

Java实现KMP算法的更多相关文章

  1. 大话数据结构(十二)java程序——KMP算法及改进的KMP算法实现

    1.朴素的模式匹配算法 朴素的模式匹配算法:就是对主串的每个字符作为子串开头,与要连接的字符串进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到成功匹配或全部遍历完成为止. 又称BF算法 ...

  2. KMP算法-Java实现

    目的: 为了解决字符串模式匹配 历程: 朴素模式匹配:逐次进行比较 KMP算法:利用匹配失败得到的信息,来最大限度的移动模式串,以此来减少比较次数提高性能 概念: m:是目标串长度 n:是模式串长度 ...

  3. 经典KMP算法C++与Java实现代码

    前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...

  4. [转]KMP算法理解及java实现

    这大概是我看的最好懂的KMP算法讲解了,不过我还只弄懂了大概思想,算法实现我到时候用java实现一遍 出处:知乎 https://www.zhihu.com/question/21923021/ans ...

  5. KMP算法中next数组的理解与算法的实现(java语言)

    KMP 算法我们有写好的函数帮我们计算 Next 数组的值和 Nextval 数组的值,但是如果是考试,那就只能自己来手算这两个数组了,这里分享一下我的计算方法吧. 计算前缀 Next[i] 的值: ...

  6. 算法(Java实现)—— KMP算法

    KMP算法 应用场景 字符串匹配问题 有一个字符串str1 = " hello hello llo hhello lloh helo" 一个子串str2 = "hello ...

  7. Java数据结构之字符串模式匹配算法---KMP算法2

    直接接上篇上代码: //KMP算法 public class KMP { // 获取next数组的方法,根据给定的字符串求 public static int[] getNext(String sub ...

  8. Java数据结构之字符串模式匹配算法---KMP算法

    本文主要的思路都是参考http://kb.cnblogs.com/page/176818/ 如有冒犯请告知,多谢. 一.KMP算法 KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基 ...

  9. KMP算法的java实现

    package com.trs.utils; public class KMPStr { /* * 在KMP算法中,最难求的就是next函数,如何理解next函数是一个难题,特别是k=next[k], ...

随机推荐

  1. Sql Server 2005 CLR实例

    本文转载:http://www.cnblogs.com/yongfa365/archive/2010/04/26/SQL-Server-CLR.html CSDN:博客参考http://blog.cs ...

  2. Android开发 - 下拉刷新和分段头悬停列表

    项目源码 本文所述项目已开源,源码地址 为什么做PullToRefresh-PinnedSection-ListView 前段时间因为项目需求,需要在Android中对ListView同时增加下拉刷新 ...

  3. 18、MySQL内存体系架构及参数总结

    内存结构: Mysql 内存分配规则是:用多少给多少,最高到配置的值,不是立即分配 图只做大概参考 全局缓存包括: global buffer(全局内存分配总和) =    innodb_buffer ...

  4. 解决java.sql.SQLException: Parameter number X is not an OUT parameter--转

    最近独自一个人写项目,孤军奋战的程序猿可真伤不起! Java 调用MYSQL带输入输出参数存储过程时如题错误:java.sql.SQLException: Parameter number X is ...

  5. 几句话实现导航栏透明渐变 – iOS

    首先我们来看下效果 一开始当我们什么只设置了一张图片作为它的头部视图的时候,它是这样的 首当其冲的,我们先得把导航栏弄透明 那么我们首先得知道,设置navigationBar的BackgroundCo ...

  6. Android(java)学习笔记214:开源框架的文件上传(只能使用Post)

    1.文件上传给服务器,服务器端必然要写代码进行支持,如下: 我们新建一个FileUpload.jsp的动态网页,同时我们上传文件只能使用post方式(不可能将上传数据拼凑在url路径下),上传数据Ap ...

  7. ZOJ3527

    题意:给你一个有向图,一共N个顶点,且每个顶点只有一个前驱或后继,在顶点上建立圣地,那么就可以获得一个信仰值,如果在这个顶点的后继节点上也建立圣地,那么将改变一定的信仰值,求解能获取的最大信仰值. 思 ...

  8. jquery获取元素到屏幕底的可视距离

    jquery获取元素到屏幕底的可视距离 要打对号的图里的height(我自称为可视高度:滚动条未滑到最底端)  不是打叉图里的到页面底部(滚动条到最底部时的height)(offset().top方法 ...

  9. Effective java-枚举和注解思维导图

  10. Java编程思想-泛型-泛型方法

    代码示例如下: package generics; //: generics/GenericMethods.java public class GenericMethods<A> { // ...