28.找出字符串中第一个匹配项的下标


题目:28.找出字符串中第一个匹配项的下标

给你两个字符串 haystackneedle ,请你在 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 <= 10^4
haystack 和 needle 仅由小写英文字符组成

思路

  1. 获取 haystackneedle 的长度。
  2. 遍历 haystack,只遍历到 m - n 位置,因为如果剩余部分长度小于 needle 的长度则无需继续。
  3. 假设匹配,逐个字符比较 haystack 的子字符串和 needle
  4. 如果完全匹配(index2 达到 needle 的长度),返回起始下标 index1 - n
  • 时间复杂度:O(mn)
  • 空间复杂度:O(1)

代码

public int strStr(String haystack, String needle) {
    // haystack 的长度
    int m = haystack.length();
    // needle 的长度
    int n = needle.length();
    if (m < n) {
        return -1;
    }
    int index1;
    int index2 = 0;
    // 遍历 haystack,直到剩余部分长度小于 needle 的长度
    for (int i = 0; i <= m - n; i++) {
        if (haystack.charAt(i) == needle.charAt(index2)) {
            index1 = i;
            // 假设匹配,逐个字符比较
            while (index1 < m && index2 < n && haystack.charAt(index1) == needle.charAt(index2)) {
                index1++;
                index2++;
            }
            // 如果完全匹配,返回起始下标
            if (index2 > n - 1) {
                return index1 - n;
            } else {
                index2 = 0;
            }
        }
    }
    return -1;
}

文章作者: cxyexe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 cxyexe !
  目录