当前位置:   article > 正文

Python在字符串中查找子字符串_从字符串中查找子字符串

从字符串中查找子字符串

这是小白博主在刷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

因此,此种解题思路的代码如下:

  1. class Solution:
  2. def strStr(self, haystack: str, needle: str) -> int:
  3. S = haystack
  4. return S.find(needle)
  1. class Solution:
  2. def strStr(self, haystack: str, needle: str) -> int:
  3. S = haystack
  4. return S.index(needle)

注:示例2中,若未查找到子字符串,应返回-1。 find函数符合此要求,index函数不符合此要求。因此,显然find函数更适合此题目。

 

 

在这里还要简单地介绍一下与 find和index函数很相似的rfind和rindex函数,区别在于rfind/rindex函数返回的是最后一次出现这个字符串的索引位置,而find/index函数返回的是第一次出现这个字符串的索引位置。

  1. class Solution:
  2. def strStr(self, haystack: str, needle: str) -> int:
  3. S = haystack
  4. return S.index(needle)
  5. solution = Solution()
  6. print(solution.strStr("albjnbl", "l"))
  7. >>>1
  1. class Solution:
  2. def strStr(self, haystack: str, needle: str) -> int:
  3. S = haystack
  4. return S.rindex(needle)
  5. solution = Solution()
  6. print(solution.strStr("albjnbl", "l"))
  7. >>>6

 

2.暴力匹配——双指针

如上图所示,我们可以将母字符串 haystack 中与子字符串 needle 长度相等的子字符串一一与needle的每一位比较。

  • 时间复杂度:O(n\times m),其中 n 是字符串 haystack 的长度,m 是字符串 needle 的长度。最坏情况下我们需要将字符串 needle 与字符串 haystack 的所有长度为 m                     的子串均匹配一次。
  • 空间复杂度:O(1)。我们只需要常数的空间保存若干变量。

 

3.暴力匹配——单指针

Python可以直接对比两个字符串是否相同,因此我们可以直接对比两个子字符串是否相等,不用逐一对比字符串中的元素。

  1. class Solution:
  2. def strStr(self, haystack: str, needle: str) -> int:
  3. len1 = len(haystack)
  4. len2 = len(needle)
  5. if len2 == 0:
  6. return 0
  7. if len2 > len1:
  8. return -1
  9. else:
  10. for i in range(len1 - len2 + 1):
  11. fal_needle = haystack[i:i+len2]
  12. if fal_needle == needle:
  13. return i
  14. return -1

 

4.KMP算法

等博主看懂后再更新hhh~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/153619
推荐阅读
相关标签
  

闽ICP备14008679号