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

解题思路:

        1.获取信息:

                给定两个字符串haystack和needle,需要确认是否needle是haystack的一个子串

                如果是,返回needle在haystack中第一次出现的首字符的下标

                倘若不是,返回-1

        2.分析题目:

通过                要确认一个字符串是否是另一个字符串的子串,我首先想到的是KMP算法,但我又不想用八股文,所以想了另外一种方式,借用了滑动窗口法和动态规划的思想,你能够自己想一下,再看下面的代码解析

        3.示例查验:

                (示例查验环节其实还蛮重要的,它可以帮助你更好地理解题目,避免歧义,而且还可以提醒你不要遗漏信息,我是很喜欢这个环节的)

                示例1:如果确认needle是haystack的子串,返回第一个匹配项的下标

                示例2:如果确认needle不是hatstack的子串,返回-1

        4.尝试编写代码

                (1)暴力法(借用了滑动窗口法和动态规划的思想)

另一个字符串的子串,那么就少不了字符串之间的比较,所以该怎么进行比较呢?就是                        思路:既然要确认一个字符串是否

                        我们知道needle的长度在每个例子中是固定的,于是我们允许在haystack中从头开始,每次比较就取needle长度的子串进行比较

                        如果确认是子串,那么返回首字符的下标即可

子串,就继续比较即可就是                        如果不

(我只是说一下核心思路,下面的代码时已经经过优化后的版本了,但核心还是没变)

class Solution {
public:
int strStr(string haystack, string needle) {
int size1=haystack.size();//haystack字符串的大小
int size2=needle.size();//needle字符串的大小
int begin=0,end=size2-1;//准备两个指针用于从haystack中选取长度为needle的长度的字符串
while(begin-1//只有两个指针指向一个有效的数才可以继续循环
if(haystack[begin]==needle[0]&&haystack[begin+end]==needle[end]&&GetRes(haystack,needle,begin,begin+end))return begin;//如果确认为子串
begin++;
}
return -1;//如果不为子串
}
private:
bool GetRes(string&haystack,string&needle,int left,int right){//两个指针分别从两端向中间移动,核查是否满足是子串的条件
int begin=0,end=needle.size()-1;
while(leftif(haystack[left]!=needle[begin]||haystack[right]!=needle[end])return false;
begin++;left++;right--;end--;
}
return true;
}
};

                (2)KMP算法

                        这个就先留着,等到后续再进行补齐,让我好好想想该怎么通俗易懂地讲述,以便为你提供便利的同时而不浪费你的时间

还是提一嘴,纸上得来终觉浅,绝知此事要躬行

posted @ 2025-07-22 15:45  yfceshi  阅读(9)  评论(0)    收藏  举报