代码随想录算法训练营第九天|LeetCode28找出字符串中第一个匹配项的下标

题1:

指路:LeetCode28 找出字符串中第一个匹配项的下标
思路与代码:
1.指针暴力

第一反应这样做,代码如下:

class Solution {
public:
    int strStr(string haystack, string needle) {
        //思路:两个指针分别指向数组1和数组2的开头,一样的话就数组2的左指针右移一个,不一样的话数组1的左指针右移一个
        //到数组1的指针达到右边界(此时返回-1)或数组2的左指针到最右(此时返回数组1的左指针)为止
    int right1 = haystack.size();  // 数组1的左右边界
    int right2 = needle.size();  // 数组2的左右边界
        for (int left1 = 0; left1 + right2 <= right1; left1++) {
            bool flag = true;
            for (int left2 = 0; left2 < right2; left2++) {
                if (haystack[left1 + left2] != needle[left2]) {
                    flag = false;
                    break;
                }
            }
        if (flag)
        return left1;
     }
   return -1;
    }
};
2.KMP算法

好难,一刷没搞明白,先看看代码吧。

class Solution {
public:
void getNext(int* next, const string& s) {
    int j = 0;
    next[0] = 0;
    for (int i = 1; i < s.size(); i++) {
        while (j > 0 && s[i] != s[j]) {
            j = next[j -1];
        }
        if (s[i] == s[j]) {
            j++;
        }
        next[i] = j;
    }
}
    int strStr(string haystack, string needle) {
    if (needle.size() == 0) {
        return 0;
    }
    int next[needle.size()];
    getNext(next, needle);
    int j = 0;
    for (int i = 0; i < haystack.size(); i++) {
        while (j > 0 && haystack[i] != needle[j]) {
            j = next[j - 1];
        }
        if (haystack[i] == needle[j]) {
            j++;
        }
        if (j == needle.size()) {
            return (i - needle.size() + 1);
        }
    }
    return -1;
    }
};

寥寥草草的解题,因为真的有点难。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

R.S.G.久夏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值