28.实现 strStr()
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
示例 1:
1 | 输入:haystack = "hello", needle = "ll" |
示例 2:
1 | 输入:haystack = "aaaaa", needle = "bba" |
示例 3:
1 | 输入:haystack = "", needle = "" |
解题思路
这是一道经典的字符串匹配题目,有多种解法。
核心思想
- 暴力匹配:双重循环比较
- KMP算法:优化字符串匹配
- 内置函数:使用语言内置的字符串查找函数
方法一:暴力匹配(推荐初学者)
时间复杂度 O(m×n)、空间复杂度 O(1)
1 | /** |
方法二:优化版本
1 | var strStr = function(haystack, needle) { |
方法三:KMP算法(高级解法)
时间复杂度 O(m+n)、空间复杂度 O(n)
1 | var strStr = function(haystack, needle) { |
方法四:使用内置函数
1 | var strStr = function(haystack, needle) { |
解题要点
- 边界处理:
- needle为空字符串时返回0
- haystack长度小于needle长度时返回-1
- 暴力匹配:
- 双重循环,外层遍历haystack的每个位置
- 内层比较从该位置开始的子串是否匹配needle
- KMP算法:
- 构建next数组,避免重复比较
- 时间复杂度优化到O(m+n)
面试要点
- 高频考点:这道题是面试中的高频题目
- 算法选择:能够分析不同算法的时间复杂度
- 边界处理:注意各种边界情况的处理
- KMP算法:了解KMP算法的原理和应用
相关题目
- 459.重复的子字符串 - 字符串匹配的应用
- 686.重复叠加字符串匹配 - 字符串匹配变种
- 796.旋转字符串 - 字符串操作
扩展思考
为什么KMP算法更快?
- 利用已经匹配的信息,避免重复比较
- next数组记录了模式串的自匹配信息
时间复杂度分析
- 暴力匹配:O(m×n)
- KMP算法:O(m+n)
- 内置函数:通常也是O(m+n)
边界情况
- needle为空:返回0
- haystack为空,needle不为空:返回-1
- 两个都为空:返回0
实际应用
- 文本编辑器中的查找功能
- 数据库中的字符串搜索
- 网络协议中的模式匹配
最后更新: 2021-09-09