文章目录
- 写在前面
- Tag
- 题目来源
- 解题思路
- 方法一:find
- 方法二:暴力匹配
- 方法三:KMP
- 写在最后
写在前面
本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……
专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:
- Tag:介绍本题牵涉到的知识点、数据结构;
- 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
- 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
- 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
- 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。
Tag
【字符串】【find】
题目来源
28. 找出字符串中第一个匹配项的下标
解题思路
方法一:find
仔细阅读题目内容,发现要实现的函数就是 C++ 中 string 类下的成员函数 find,即查找 needle
在字符串 haystack
指定位置后第一次出现的位置。
代码
class Solution {
public:
int strStr(string haystack, string needle) {
return haystack.find(needle);
}
};
方法二:暴力匹配
思路
我们可以让字符串 needle
与字符串 haysyack
的所有长度为 m
(needle
的长度) 的子串均匹配一次。
代码
class Solution {
public:
int strStr(string haystack, string needle) {
int n = haystack.size(), m = needle.size();
for (int i = 0; i + m <= n; ++i) {
bool flag = true;
for (int j = 0; j < m; ++j) {
if (haystack[i + j] != needle[j]) {
flag = false;
break;
}
}
if (flag) {
return i;
}
}
return -1;
}
};
复杂度分析
时间复杂度:
O
(
n
m
)
O(nm)
O(nm),
n
n
n 是字符串 haystack
的长度,
m
m
m 是字符串 needle
的长度。
空间复杂度: O ( 1 ) O(1) O(1)。
方法三:KMP
关于 KMP 解法,可以参考 一文讲清楚字符串搜索问题【朴素法】和【KMP算法】。
写在最后
如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。
如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。
最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。