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

embedded/2025/1/20 15:43:43/

一.题目

给你两个字符串 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 为空字符串的情况,应返回 0if (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 完全匹配时,返回 kif (needle[j] == '\0') {return k;}}// 未找到匹配的情况return -1;
}


http://www.ppmy.cn/embedded/155524.html

相关文章

Socket编程和TCP协议实现

目录 什么是SocketSocket的特点网络通信三要素Socket和TCP的关系Socket编程的流程Socket 函数socket()函数原型参数详解返回值参数举例 Socket重要数据结构和函数解析sockaddr_in结构体sockaddr_in结构体定义 bind函数函数原型参数详解为什么需要bind() listen函数函数原型参数…

数字图像处理:实验二

任务一&#xff1a; 将不同像素&#xff08;32、64和256&#xff09;的原图像放大为像素大 小为1024*1024的图像&#xff08;图像自选&#xff09; 要求&#xff1a;1&#xff09;输出一幅图&#xff0c;该图包含六幅子图&#xff0c;第一排是原图&#xff0c;第 二排是对应放大…

使用插件时的注意事项

在使用插件时&#xff0c;需要注意一些关键事项&#xff0c;确保插件能够稳定、安全地工作&#xff0c;并且不会给系统带来风险或负担。以下是使用插件时需要注意的几个重要方面&#xff1a; 1. 插件来源与信任度 官方渠道与可靠来源&#xff1a;总是选择来自官方网站、知名平…

C# 控制打印机:从入门到实践

在开发一些涉及打印功能的应用程序时&#xff0c;使用 C# 控制打印机是一项很实用的技能。这篇文章就来详细介绍下如何在 C# 中实现对打印机的控制。 一、准备工作 安装相关库&#xff1a;在 C# 中操作打印机&#xff0c;我们可以借助System.Drawing.Printing命名空间&#x…

【STM32 USB】USB描述符

USB各种描述符的拓扑关系 每一个USB设备只有一个设备描述符&#xff0c;主要向主机说明设备类型、端点0最大包长、设备版本、配置数量等等。每一个USB设备至少有一个或者多个配置描述符&#xff0c;但是主机同一时间只能选择某一种配置。标准配置描述符主要向主机描述当前配置下…

Vim 项目的现状

以下是 Vim 项目的现状&#xff1a; 维护与开发团队 团队变动&#xff1a;创始人 Bram Moolenaar 于 2023 年 8 月去世后&#xff0c;主要维护者 Christian Brabandt 承担起更多责任&#xff0c;并接纳了更多的开发者加入&#xff0c;如 Yegappan Lakshmanan、Dominique Pell …

第15章:Python TDD应对货币类开发变化(二)

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…

w163美食推荐商城

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…