算法训练营day9

本文讲述了作者在LeetCode上的两道字符串匹配题目,分享了使用暴力方法和双指针解决字符串查找的策略,以及初次接触KMP算法的经历,强调算法学习的实践重要性。

题目1:28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)

这道题自己是有思路的,然后竟然AC过了,很意外。因为看代码随想录里说要用KMP算法,这个是什么都不知道,感觉很难。我的思路就是对 haystack 字符串遍历,然后当该字符串中的第 i 个字符等于 needle[0] ,我就遍历 needle 字符串比对这个字符串和 haystack 字符串 i 之后到 needle.size() 个字符串是否相等,相等就返回 i ,这里比对用的 while ,会进行 i ++ 和 j++ ,如果不相等就 将 i 赋值最开始的 i (因为后面比对对 i 进行了++ 操作, 这里我最开始没有加,导致bug没有AC过所有样例),如果 遍历完 j == needle.size() 就是找到了匹配的 返回最开始进入遍历的 i ,否则就返回 -1。代码附下:

class Solution {
public:
    int strStr(string haystack, string needle) {
        for(int i = 0;i < haystack.size();i++) {
            if(haystack[i] == needle[0]) {
                int flag = i;
                int j = 0;
                while(haystack[i] == needle[j] && i < haystack.size() && j < needle.size()) {
                    i++;
                    j++;
                }
                if(j == needle.size()) {
                    return flag;
                }else {
                    i = flag;
                }
            }
        }
        return -1;
    }
};

题目2:459. 重复的子字符串 - 力扣(LeetCode)

这道题里边用了库函数find,其实自己实现还是很麻烦的,这里我也是参考了移动匹配,就是s+s 得到新的字符串SS,如果SS中还有s证明该字符串是可以由子字符串组成的。

字符串总结:字符串里用到了很多双指针的操作,有些算法还是很巧妙的,目前还没办法说像做题一样对这些东西进行一个分类,例如遇到什么样的题就怎么怎么样,其实我们学习算法也是为了通过一道题,有些题通过暴力方法可能需要很麻烦的思考各种条件,而有了这些算法的直到,我们可以清晰明了的AC。具体的题目就要因题而议了,还是要多反复看。字符串KMP算法,我先跳过了确实有些看的不是很明白。不过KMP是针对这种字符串匹配的一把好手。

双指针总结:多做几遍题吧,从里边慢慢体会双指针的好处吧。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值