LeetCode 28.找出字符串中第一个匹配项的下标(c++)

172 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

28.找出字符串中第一个匹配项的下标

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 。

示例 1 :

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1

提示:

  • 1 <= haystack.length, needle.length <= 104
  • haystack 和 needle 仅由小写英文字符组成

二、思路分析

本来以为是设置了两个指针,一左一右来包含符合条件的区间。结果感觉就是做不出来。看了别人的评论才知道,是用了两个指针,但两个指针分别指向的是两个数组,j用来记录原字符串中符合条件的位置,k则是用来记录要查找的字符串中符合条件的位置。一个从i开始,一个从0开始,用了两个变量。

除此之外,这题还有更加简便的解法,就是用KMP算法去解。我又查阅了一些资料,了解了kmp算法,从而更简便的解出了题目。

三、AC代码

class Solution {
public:
    int strStr(string s, string p) {
        int n = s.size(), m = p.size();
        for(int i = 0; i <= n - m; i++){
            int j = i, k = 0; 
            while(k < m and s[j] == p[k]){
                j++;
                k++;
            }
            if(k == m) return i;
        }
        return -1;
    }
};

四、总结

好难啊,明明觉得有思路,就是不知道怎么写出来。