leetcode刷题_实现 strStr()

题目描述

在这里插入图片描述

Java解决方法

KMP算法原理比较难懂,但是还是得会写相对应的程序:

class Solution {
    public int strStr(String haystack, String needle) {
        //使用的是KMP算法
        int hlen = haystack.length();
        int nlen = needle.length();
        if(nlen == 0)
        {
            return 0;
        }
        int[] nextval = new int[nlen];
        int i = 0;
        int j = 0;
	    GetNextval(needle,nextval);
	    while (i < hlen && j < nlen) 
	    {
		    if (j == -1 || haystack.charAt(i) == needle.charAt(j)) 
		    {	
			    i++;
                j++;	
		    }
		    else 
            {
                j=nextval[j];
            }
	    }
	    if(j >= nlen)
        {
            return (i-nlen);
        }  
	    else
        {
            return (-1);
        }
    }

    private void GetNextval(String needle,int nextval[])  
    {
	    int j = 0;
        int k = -1;
	    nextval[0] = -1;
   	    while (j < needle.length()) 
	    {
       	    if (k == -1 || needle.charAt(j) == needle.charAt(k)) 
		    {	
			    j++;
                k++;
                if(j >needle.length() - 1)
                {
                    break;
                }
			    if (needle.charAt(j) != needle.charAt(k))
                {
                    nextval[j] = k;
                } 
           	    else
                {
                    nextval[j] = nextval[k];
                }  
       	    }
       	    else  
            {
                k = nextval[k]; 
            }  	
	    }
    }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

身影王座

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值