字符串简单1 种解法
#28找出字符串中第一个匹配项的下标
返回 needle 在 haystack 中首次完整出现的起始下标,不存在则返回 -1。
#字符串#字符串匹配
原题
给你两个字符串 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 <= 104haystack和needle仅由小写英文字符组成
解题主线
- 起点最多枚举到 n - m;从每个候选起点向后逐字符核对。
解法 1:朴素字符串匹配
枚举每个可能起点,并比较长度为 m 的窗口。
-
时间复杂度: O((n - m + 1) × m) 最坏
-
空间复杂度: O(1)
final class Solution {
public int strStr(String haystack, String needle) {
int n = haystack.length();
int m = needle.length();
// 只枚举还能容纳完整 needle 的候选起点。
for (int start = 0; start + m <= n; start++) {
int offset = 0;
while (offset < m && haystack.charAt(start + offset) == needle.charAt(offset)) {
offset++;
}
// 连续匹配 m 个字符时,当前起点就是首次出现位置。
if (offset == m) return start;
}
return -1;
}
}边界与易错点
- needle 为空时按题意返回 0。
- needle 比 haystack 长时循环不执行,应自然返回 -1。
整理来源
由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。
easy/Q028_strStr.java