leecode 28. 实现 strStr() 极易理解版本

题目要求

在这里插入图片描述

解题思路

其一:BF解法
使用双指针分别指向haystackneedle的指针h以及n分两种情况处理上述问题
a.haystack[h]==needle[n]时,将两指针均向前移动,继续向后匹配

h++;n++;

b.haystack[h]!=needle[n]时 ,两指针hb所指的字符不相匹配,回溯将n指针回溯回起始位置needle[0],同时将h指针从匹配位置向前进一位

h=h-n+1;
n=0;

注意:
语句的顺序极其重要!!!必须先将h指针回溯,保证了此时的n指针的值还没变化,当h指针归位后才能将n指针归位(答主的惨痛教训)

当回溯完成,指针归位后,在此情况下对回溯后的情况进行判断:是否归位后的字符可以匹配,如果不相匹配,将指向haystack的指针向前移动(此语句极其重要不可缺少,不可合并在下一次循环中,否则将陷入死循环中,h指针永远不向前移动

if(haystack[h]!=needle[n])
   h++;

总代码

class Solution {
public:
    int strStr(string haystack, string needle) {
        if(!needle.length())
           return 0;
        int h=0,n=0;
        while(h<haystack.length()&&n<needle.length()){
            if(haystack[h]==needle[n]){
                h++;n++;
            }else{
                h=h-n+1;
                n=0;
                if(haystack[h]!=needle[n])
                    h++;
            }
        }
        return  n==needle.length()?h-needle.length():-1;
    }
};

小结:BF算法虽然易于理解和掌握但由于每当出现不相匹配的情况时,h指针都得回溯到初始位置的下一位以及n指针回溯到0的位置,效率低下,因此时间复杂度高

优化

针对上述BF算法的暴力求解时间复杂度高,效率低下的问题,由此延伸出KMP算法,极大的解决了上述问题但由于KMP算法过于繁琐以及答主纵阅多篇文章回答,发现一位答主的回答很详尽也便于理解,由此引用一下大佬的回答(大佬要是介意的话,答主会删除的QAQ)

其二: KMP算法

传送门!

答主弱弱吐槽一句,凭什么leecode把它归为简单啊QAQ,不会KMP不配刷题吗QAQ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值