题解 | #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 i=0;
		int s=0;
        /*while((i=T.indexOf(S, i))!=-1) {
        	s++;
        	i++;
        }*/
		int[] arr = getnext(S);
		for(int j=i;i<T.length();i++,j++) {
			if(T.charAt(i)!=S.charAt(j)) {
				j=arr[j];
				if(j==-1) {
					continue;
				}
				//再来比一次
				i--;
				j--;
			}
			if(j==S.length()-1) {//匹配到了
				s++;
				j=arr[j]; // -------虽然匹配上了,但当做没匹配上,可以找到重叠的部分
			}
		}
		
		
        return s;
    }
    public static int[] getnext(String s) {
		int[] result = new int[s.length()];
		char ii, jj;
		/*
        双层循环生成数组,下面优化成动态规划单层循环生成
        for(int i =1;i<s.length();i++) { 
			ii = s.charAt(i);
			for(int j=i+1;j<s.length();j++) {
				jj=s.charAt(j);
				if(result[j-1]==i-1) {
					if(jj==ii) {
						result[j]=i;
					}
				}
			}
		}
		result[0]=-1;*/
		Arrays.fill(result, -1);
		for(int i=1;i<s.length();i++) {
			if(s.charAt(result[i-1]+1)==s.charAt(i)) {
				result[i]=result[i-1]+1;
			}else{
				result[i]=0;
			}
		}
		
		return result;
		
	}
}
全部评论

相关推荐

孤寡孤寡的牛牛很热情:为什么我2本9硕投了很多,都是简历或者挂,难道那个恶心人的测评真的得认真做吗
点赞 评论 收藏
分享
菜菜咪:1. 可以使用简历网站的模版,美观度会更好一点 2. 邮箱可以重新申请一个,或者用qq邮箱的别名,部分hr可能会不喜欢数字邮箱 3. 项目经历最好分点描述,类似的项目很多,可以参考一下别人怎么写的 4. 自我评价可加可不加,技术岗更看重技术。最后,加油,优秀士兵
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务