实现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算法 待更新------>