Bootstrap

力扣9-找出字符串中第一个匹配项的下标

一.题目

给你两个字符串 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 。

二.代码

int strStr(char* haystack, char* needle)
{
    int len1=strlen(haystack);
    int len2=strlen(needle);
    int i,j,k=0;
    while(j<len2)
    {
        j=0;
        i=k;
        while(haystack[i]==needle[j]&&haystack[i]!='\0'&&needle[j]!=0)
        {
            i++;
            j++;
        }
        if(haystack[i]=='\0'&&needle[j]!='\0')
        {
            return -1;
        }
        if(needle[j]=='\0')
        {
            return k;
        }
        else
        {
            k++;
        }
    }
    return -1;
}

三.代码解释

  • 该函数 strStr 的功能是在字符串 haystack 中查找子字符串 needle 首次出现的位置。
    • 首先,使用 strlen 函数计算 haystack 的长度 len1 和 needle 的长度 len2
    • 初始化三个整型变量 ij 和 k,其中 k 用于标记在 haystack 中开始匹配的位置,初始值为 0。
    • 进入外层的 while 循环,循环条件是 j < len2,但这里存在问题,因为 j 在每次循环开始时被置为 0,导致该循环的执行逻辑可能不符合预期。
    • 在内层 while 循环中:
      • 每次将 j 重置为 0,将 i 重置为 k,这意味着每次都从 haystack 的 k 位置开始进行匹配。
      • 只要 haystack[i] 和 needle[j] 相等,且它们都不为 '\0'i 和 j 会依次递增。
    • 当内层循环结束时,会进行以下判断:
      • 如果 haystack[i] 为 '\0' 且 needle[j] 不为 '\0',表示 haystack 已经结束,但 needle 还未完全匹配,返回 -1。
      • 如果 needle[j] 为 '\0',表示找到了匹配,返回 k 作为 needle 在 haystack 中首次出现的位置。
      • 否则,将 k 加 1,继续从 haystack 的下一个位置开始查找。

四.补全代码

#include <stdio.h>
#include <string.h>

int strStr(char* haystack, char* needle) {
    int len1 = strlen(haystack);
    int len2 = strlen(needle);
    // 处理 needle 为空字符串的情况,应返回 0
    if (len2 == 0) {
        return 0;
    }
    int i, j, k;
    // 循环条件修改为 k <= len1 - len2,当 k 超过此范围时,不可能有匹配
    for (k = 0; k <= len1 - len2; k++) {
        i = k;
        j = 0;
        // 字符比较循环
        while (haystack[i] == needle[j] && haystack[i]!= '\0' && needle[j]!= '\0') {
            i++;
            j++;
        }
        // 当 needle 完全匹配时,返回 k
        if (needle[j] == '\0') {
            return k;
        }
    }
    // 未找到匹配的情况
    return -1;
}

;