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

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

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.暴力匹配——双指针

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

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

 

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~

评论 1 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

AA_WangZai

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值