sunday算法

sunday算法是个特别容易记和理解的算法,但是我看网上很多博客都写错了。所以整理了一下,

 

防止自己遗忘,sunday算法的原理很简单。

 

 1. 匹配,然后出现不匹配的时候,看主串最后一个元素的下一个元素,从右往左(为什么从右往左)检查子串是否包含(为什么要这样)

为什么从右往左:因为下一个如果匹配的子串,第一个肯定先和最右边的那个i对应上,这样就跳过了好多。

2.重新对上以后,再重复一步骤,是不是很简单,但是代码可不简单。

代码:难点是位置的坐标很容易混,有个好记的办法就是,没有常数+1或者-1

class Solution {
    public int strStr(String haystack, String needle) {
            if(haystack!=null&&needle.equals(""))
             return 0;
            int x=0;
            int j=0;
            while(x<haystack.length()&&j<needle.length())
            {
                int  num=0;
                while(x+num<haystack.length()&&num<needle.length()&&haystack.charAt(x+num)==needle.charAt(num))
                {
                    num++;
                }
                if(num==needle.length())
                    return x;
                char p=' ';
                if(x+needle.length()<haystack.length())
                    p=haystack.charAt(x+needle.length());
                int loc=needle.lastIndexOf(p);
                if(loc==-1)
                    x=x+needle.length();
                else
                {
                x=x+needle.length()-loc;
                }
            }
            return -1; 
    }
}

 

转载于:https://www.cnblogs.com/pc-m/p/11444006.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值