题解 | #kmp算法#

kmp算法

http://www.nowcoder.com/practice/bb1615c381cc4237919d1aa448083bcc

import java.util.*;

public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 计算模板串S在文本串T中出现了多少次 * @param S string字符串 模板串 * @param T string字符串 文本串 * @return int整型 */ public int kmp (String S, String T) { //特殊情况判断 int m=S.length(),n=T.length(); if(m>n||n==0) return 0;

    //初始化计数,获取next数组
    int cnt=0;
    int[] next=getNext(S);
    
    //遍历主串和模式串
    for(int i=0,j=0;i<n;i++){
        //只要不相等,回退到next数组记录的下一位
        while(j>0&&T.charAt(i)!=S.charAt(j)){
            j=next[j-1];
        }
        if(T.charAt(i)==S.charAt(j)) j++;
        //如果j为m,说明完全匹配一次
        if(j==m){
            //计数加一,索引回退到next数组记录的下一位
            cnt++;
            j=next[j-1];
        }
    }
    return cnt;
}

//确定next数组
private int[] getNext(String S){
    int m=S.length();
    int[] next=new int[m];
    for(int i=1,j=0;i<m;i++){
        //只要不相等,回退到next数组记录的下一位
        while(j>0&&S.charAt(i)!=S.charAt(j)){
            j=next[j-1];
        }
        //前缀索引后移
        if(S.charAt(i)==S.charAt(j)) j++;
        //确定应该回退到的下一个索引
        next[i]=j;
    }
    return next;
}

}

我居南半坡 文章被收录于专栏

多刷题,积蓄力量,欢迎讨论

全部评论

相关推荐

简历求拷打,海投简历发过去就已读不回了求大佬们指点
程序员牛肉:基本不能了,估计你得放弃秋招,九月份找实习之后明年的春招开始正式找工作
点赞 评论 收藏
分享
在debug的柠檬精很迷人:好消息:现在HR挑三拣四 15年后 HR跪着求要简历 坏消息:被挑的是这代人,到时候求人的也是这代人。真好。
点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务