28. 实现 strStr()
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = “hello”, needle = “ll”
输出: 2
示例 2:
输入: haystack = “aaaaa”, needle = “bba”
输出: -1
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
解题思路
方法一:双指针(线性时间复杂度)
思路如下:
1. 定义指针i
和j
分别指向haystack
和needle
;
2. 制造一个循环,从两个字符串的首字母开始进行比较,如果对应指针的字母相同,则i++
,j++
;如果不同,因可能匹配了部分子串,需要进行回溯,i = i - j + 1
,j = 0
. (j
有两个作用,一个是用于寻找needle字符的索引,另一个作用为对匹配的子串计数,当j==needle.length()
则匹配完成)
3. 最后,比较j == needle.length()
:相同,则找到了;不同,则找不到
借用官方的题解图比较清晰的体现回溯,i
代表Pn
,j
代表pl
。
public class Solution {
public int strStr(String haystack, String needle) {
//指向haystack
int i = 0;
//指向needle
int j = 0;
while(i < haystack.length() && j < needle.length()){
if(haystack.charAt(i) == needle.charAt(j)){
i++;
j++;
}else{
//回溯
i = i - j + 1;
//计数清零,索引置为0
j = 0;
}
}
return j == needle.length() ? i - needle.length() : -1 ;
}
}