这是小白博主在刷leetcode时遇到的一道题,这是博主近日刷的leetcode题库时结果表现最好的一道题,故在此分享这份喜悦。
希望在以后的日子里可以继续进步,持之以恒。
目录
题目介绍
解题思路及代码
1.调用函数——find/index
2.暴力匹配——双指针
3.暴力匹配——单指针
4.KMP算法
题目介绍
这道题是leetcode题库中的一道简单题(28)题,题目描述如下:
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-strstr
解题思路及代码
这里有四种解题思路供读者参考:
1.调用函数——find/index
(1)find函数:
str.find(str, beg=0, end=len(string))
- str -- 指定检索的字符串
- beg -- 开始索引,默认为0。
- end -- 结束索引,默认为字符串的长度。
- 若beg和end省略,则取默认值。
如果包含子字符串返回索引值,否则返回-1。
(2)index函数:
str.index(str, beg=0, end=len(string))
- str -- 指定检索的字符串
- beg -- 开始索引,默认为0。
- end -- 结束索引,默认为字符串的长度。
- 若beg和end省略,则取默认值。
如果包含子字符串返回开始的索引值,否则抛出异常,即返回:ValueError: substring not found
因此,此种解题思路的代码如下:
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
S = haystack
return S.find(needle)
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
S = haystack
return S.index(needle)
注:示例2中,若未查找到子字符串,应返回-1。 find函数符合此要求,index函数不符合此要求。因此,显然find函数更适合此题目。
在这里还要简单地介绍一下与 find和index函数很相似的rfind和rindex函数,区别在于rfind/rindex函数返回的是最后一次出现这个字符串的索引位置,而find/index函数返回的是第一次出现这个字符串的索引位置。
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
S = haystack
return S.index(needle)
solution = Solution()
print(solution.strStr("albjnbl", "l"))
>>>1
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
S = haystack
return S.rindex(needle)
solution = Solution()
print(solution.strStr("albjnbl", "l"))
>>>6
2.暴力匹配——双指针
如上图所示,我们可以将母字符串
中与子字符串
长度相等的子字符串一一与needle的每一位比较。
- 时间复杂度:,其中 是字符串 的长度, 是字符串 的长度。最坏情况下我们需要将字符串 与字符串 的所有长度为 的子串均匹配一次。
- 空间复杂度:。我们只需要常数的空间保存若干变量。
3.暴力匹配——单指针
Python可以直接对比两个字符串是否相同,因此我们可以直接对比两个子字符串是否相等,不用逐一对比字符串中的元素。
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
len1 = len(haystack)
len2 = len(needle)
if len2 == 0:
return 0
if len2 > len1:
return -1
else:
for i in range(len1 - len2 + 1):
fal_needle = haystack[i:i+len2]
if fal_needle == needle:
return i
return -1
4.KMP算法
等博主看懂后再更新hhh~