实现strStr()
算法-实现strStr()
背景
-
算法–实现strStr()
-
博主以代码随想录算法公开课进行学习
题目
-
实现 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() 定义相符。
思路
- strStr () 的本质是「字符串匹配」:在
haystack(主串)中找needle(模式串)的第一个出现位置。 - 前缀表(next 数组):记录模式串
needle中每个位置的「最长相等前后缀长度」,目的是当匹配失败时,模式串不用从头匹配,而是回退到最长相等前缀的位置,减少重复匹配。- 前缀:不包含最后一个字符的所有以第一个字符开头的子串(比如
"abc"的前缀是"a"、"ab"); - 后缀:不包含第一个字符的所有以最后一个字符结尾的子串(比如
"abc"的后缀是"c"、"bc");
- 前缀:不包含最后一个字符的所有以第一个字符开头的子串(比如
- 匹配过程:
- 用两个指针
i(主串指针)、j(模式串指针)遍历; - 当
haystack[i] == needle[j]时,两个指针同时后移; - 当匹配失败时,
j根据 next 数组回退(j = next[j-1]),而i不回退; - 当
j == needle.length()时,说明匹配成功,返回起始位置i - needle.length() + 1。
- 用两个指针
代码
1 | class Solution { |
总结
- KMP 算法的核心价值
- 解决「字符串匹配」问题,避免暴力匹配的重复遍历,时间复杂度从 O (n*m) 优化到 O (n+m);
- 前缀表(next 数组)是 KMP 的灵魂,作用是「记录模式串每个位置的最长相等前后缀长度,匹配失败时指导模式串指针回退」。