题目来源:https://leetcode-cn.com/problems/implement-strstrpython
实现 strStr() 函数。面试
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。若是不存在,则返回 -1。算法
示例 1:bash
输入: haystack = "hello", needle = "ll" 输出: 2
示例 2:微信
输入: haystack = "aaaaa", needle = "bba" 输出: -1
说明:函数
当 needle 是空字符串时,咱们应当返回什么值呢?这是一个在面试中很好的问题。spa
对于本题而言,当 needle 是空字符串时咱们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。指针
思路:双指针code
算法:blog
(p 是指向 haystack 字符的指针,q 是指向 needle 字符的指针,M 表示 haystack 字符的长度,N 表示 needle 字符的长度,cur_len 表示字符匹配的长度)
具体的过程以下图所示:
class Solution: def strStr(self, haystack: str, needle: str) -> int: M, N = len(haystack), len(needle) if N == 0: return 0 p = 0 while p < M - N + 1: # 跳过子串首字符与 needle 首字符不一样的字符 while p < M - N + 1 and haystack[p] != needle[0]: p += 1 cur_len = 0 q = 0 # 开始匹配 while q < N and p < M and haystack[p] == needle[q]: p += 1 q += 1 cur_len += 1 # 彻底匹配,返回结果 if cur_len == N: return p - N # 不匹配,回溯,从新匹配 p = p - cur_len + 1 return -1
以上就是使用双指针的方法,先找到子串与给定字符首字符相同的位置,同时遍历,子串与字符进行匹配,当不匹配时进行回溯,直到遍历结束,进而解决《实现 strStr()》 问题的主要内容。
欢迎关注微信公众号《书所集录》