题目描述
实现 strStr()
函数。
给你两个字符串 haystack
和 needle
,请你在 haystack
字符串中找出 needle
字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1
。
说明
当 needle
是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle
是空字符串时我们应当返回 0
。这与 C 语言的 strstr()
以及 Java 的 indexOf()
定义相符。
示例 1
输入:haystack = "hello", needle = "ll"
输出:2
示例 2
输入:haystack = "aaaaa", needle = "bba"
输出:-1
示例 3
输入:haystack = "", needle = ""
输出:0
提示
- 1 <= haystack.length, needle.length <=
- haystack 和 needle 仅由小写英文字符组成
题目分析
这道题可以用双指针的思想求解,先获取各字符串的长度,再遍历原字符串,对两个指针指向的字符判断是否一致,如果一致则同时更新两个指针指向下一个字符继续判断,直到匹配的长度与子字符串相同,否则执行回退操作,然后继续检查字符串。
题解一
执行用时: 0 ms
内存消耗: 39.3 MB
class Solution {
public int strStr(String haystack, String needle) {
// 获取各字符串长度
int n = needle.length();
int h = haystack.length();
// 子字符串长度大于原字符串长度
if (n > h) {
// 不存在
return -1;
}
// 双指针
int i = 0;
int j = 0;
// 遍历原字符串
while (i < h) {
// 字符相同更新右指针
if (j < n && haystack.charAt(i) == needle.charAt(j)) {
++j;
} else {
// 否则进行指针回退操作
i -= j;
j = 0;
}
// 存在子字符串返回索引
if (j == n) {
return i + 1 - n;
}
++i;
}
return -1;
}
}
题解二
执行用时: 0 ms
内存消耗: 39.7 MB
class Solution {
public int strStr(String haystack, String needle) {
// 获取各字符串长度
int n = needle.length();
int h = haystack.length();
// 遍历原字符串
for (int start = 0; start < h - n + 1; ++start) {
// 调用方法直接判断是否存在匹配的子字符串
if (haystack.substring(start, start + n).equals(needle)) {
return start;
}
}
return -1;
}
}
题目来源:力扣(LeetCode)