目录
题目:
给你两个字符串
haystack
和needle
,请你在haystack
字符串中找出needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果needle
不是haystack
的一部分,则返回-1
。示例 1:
输入:haystack = "sadbutsad", needle = "sad" 输出:0 解释:"sad" 在下标 0 和 6 处匹配。 第一个匹配项的下标是 0 ,所以返回 0 。示例 2:
输入:haystack = "leetcode", needle = "leeto" 输出:-1 解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。提示:
1 <= haystack.length, needle.length <= 104
haystack
和needle
仅由小写英文字符组成
1.思路:
使用双指针法。遍历 haystack 字符串,在每个位置上判断是否存在与 needle 相匹配的子串。
2.解题方法:
遍历 haystack 字符串,在每个位置上与 needle 进行比较,如果匹配,则返回当前位置。
3.复杂度:
- 时间复杂度:O((m-n)*n),其中 m 是 haystack 的长度,n 是 needle 的长度。最坏情况下,需要比较 (m-n) 次,每次比较的时间复杂度是 O(n)。
- 空间复杂度:O(1)。
4.Code
class Solution {
public int strStr(String haystack, String needle) {
// 如果 needle 为空字符串,则返回 0
if (needle.isEmpty()) return 0;
int m = haystack.length();
int n = needle.length();
// 在 haystack 中遍历查找 needle 的起始位置
for (int i = 0; i <= m - n; i++) {
// 当在 haystack 中找到与 needle 第一个字符相匹配的位置时,开始匹配 needle
if (haystack.charAt(i) == needle.charAt(0)) {
int j = 0;
// 逐个字符比较 haystack 和 needle,如果有不匹配的字符,直接退出循环
while (j < n && haystack.charAt(i + j) == needle.charAt(j)) {
j++;
}
// 如果 needle 中所有字符都匹配,则返回起始位置 i
if (j == n) return i;
}
}
// 如果遍历完 haystack 仍未找到匹配的 needle,则返回 -1
return -1;
}
}
题解: 首先判断 needle 是否为空字符串,然后遍历 haystack,逐个位置与 needle 进行比较,找到匹配的起始位置后返回。
欢迎大家留言讨论。