28、实现strStr() -- LeetCode

本文介绍了如何实现strStr()函数,该函数用于在主字符串中查找子字符串首次出现的位置。文章提供了四种不同的实现思路,包括使用内置函数、切片遍历、双指针以及KMP算法。

题目描述

实现strStr()函数。
给定一个haystack字符串和一个needle字符串,在haystack字符串中找出needle字符串出现的第一个位置(从0开始)。如果不存在,则返回-1。

示例1:

输入:haystack = "hello",needle = "ll"
输出:2

示例2:

输入:haystack = "aaaaa", needle = "bba"
输出:-1

说明:
needle是空的字符串的时候,我们应该返回个什么样的值?这是一个在面试中很好的问题,对于本题而言,当needle是空的字符串时候我们应当返回0。这与C语言的strstr()以及java的indexOf()定义相同。

算法设计与分析:
思路1:
python3里面提供很多find的字符串函数,可以使用库函数解决。find()的使用就满足,类似于题目描述的要求(另外还有rfind(),index()等函数,注意其使用方法)

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if needle is None: return 0
        return haystack.find(needle)     

思路2:
使用切片,为了能够顺利找到结尾,在循环的时候,设置的条件是:原串长度先减去子串长度,然后逐个遍历找出目标子串。

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if needle is None: return 0
        for i in range(0,len(haystack)-len(needle)+1):
            if haystack[i:i+len(needle)] == needle:
                return i
        # 最后没有再到才返回-1
        return -1 

思路3:
使用双指针,构造一个主串循环工作指针和子串循环工作指针实现逻辑:
1、首先判断子串是否为空和主串是否小于子串,做边界处理
2、获取主串和子串的长度
3、定义内部匹配函数(这样做的好处是让功能模块单独,不至于会乱),函数传入参数就是主串的起始查找点,返回的是主串和子串双方前进时是否能够在子串限定的长度范围内做到完全匹配,匹配成功返回True,否则循环中索引值取下一个继续调用匹配函数。
4、循环调用3的匹配函数,匹配就返回对应的索引值,直到循环结束。
5、没有找到,返回-1,函数结束。
python3实现思路如下:

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if needle is None: return 0
        # 如果主串小于子串,那么可定出错
        if n1 < n2: return -1
        n1 = len(haystack)
        n2 = len(needle)
        # 传入的i就是起始位置的值
        def findstr(i):
            haystack_p = i
            needle_q = 0
            while needle_q < n2:
                if haystack[haystack_p] != needle[needle_q]:
                    return False
                else:
                    haystack_p += 1
                    needle_q += 1
            # 如果等于n2时候就说明找到了
            return True
                
        # 遍历待匹配的字符串
        for i in range(n1 - n2 + 1):
            if findstr(i):
                return i
        return -1        

思路4:使用KMP算法
待更新------>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值