当前位置: 首页 > article >正文

LeetCode-找出字符串中第一个匹配项的下标(028)

一.题目描述

给你两个字符串 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 仅由小写英文字符组成

四.解法:

方法一:遍历

以字符串 haystack 的每一个字符为起点与字符串 needle 进行比较,若发现能够匹配的索引,直接返回即可。

假设字符串 haystack 长度为 n,字符串 needle 长度为 m,则时间复杂度为 O((n−m)×m),空间复杂度 O(1)。

五.代码

Java代码

class Solution {
    public int strStr(String haystack, String needle) {
        // 如果 needle 是空字符串,返回 0
        if ("".equals(needle)) {
            return 0;
        }

        // 获取 haystack 和 needle 的长度
        int len1 = haystack.length();
        int len2 = needle.length();
        
        // 初始化指针 p 和 q
        int p = 0;
        int q = 0;
        
        // 遍历 haystack
        while (p < len1) {
            // 如果当前字符匹配
            if (haystack.charAt(p) == needle.charAt(q)) {
                // 如果 needle 只有一个字符,返回当前索引
                if (len2 == 1) {
                    return p;
                }
                // 移动指针 p 和 q
                ++p;
                ++q;
            } else {
                // 如果不匹配,回退 p 指针,并重置 q 指针
                p -= q - 1;
                q = 0;
            }

            // 如果 q 达到 needle 的长度,说明找到了匹配
            if (q == len2) {
                return p - q;
            }
        }
        
        // 如果没有找到匹配,返回 -1
        return -1;
    }
}

注释说明
    ·空字符串检查:如果 needle 是空字符串,直接返回 0。
    ·长度获取:len1 和 len2 分别表示 haystack 和 needle 的长度。
    ·指针初始化:p 用于遍历 haystack,q 用于遍历 needle。
    ·遍历和匹配:
        ·如果 haystack 的当前字符与 needle 的当前字符匹配,移动 p 和 q。
        ·如果 needle 只有一个字符且匹配,立即返回当前索引 p。
        ·如果字符不匹配,回退 p 指针到上一次匹配的下一个位置,并重置 q。
    ·匹配成功:如果 q 达到 needle 的长度,返回匹配的起始索引 p - q。
    ·返回结果:如果遍历结束没有找到匹配,返回 -1。

🌟 关注我的CSDN博客,收获更多技术干货! 🌟


http://www.kler.cn/a/500596.html

相关文章:

  • 二进制编码 和 Base64编码
  • WPF控件Grid的布局和C1FlexGrid的多选应用
  • Golang笔记——channel
  • 软件系统分析与设计综合实践-家庭维修服务系统小程序(代码见附录,私发)
  • Xcode 正则表达式实现查找替换
  • JVM之垃圾回收器概述(续)的详细解析
  • 【机器学习】零售行业的智慧升级:机器学习驱动的精准营销与库存管理
  • 【Spring Boot 应用开发】-04 自动配置-数据源
  • 【优选算法篇】:深入浅出位运算--性能优化的利器
  • EFCore HasDefaultValueSql (续1 ValueGeneratedOnAdd)
  • 金融项目实战 04|JMeter实现自动化脚本接口测试及持续集成
  • PHP语言的软件工程
  • VSCode配置php开发环境
  • Microsoft Sql Server 2019 视图
  • 第六届土木建筑及灾害防控国际学术会议暨第三届智慧城市建筑与基础设施耐久性国际学术会议(CADPC DuraBI 2025)
  • 33_操作Redis分片集群
  • 用C语言实现推箱子小游戏
  • windows C#-泛型方法
  • Python----Python基础(字符串,列表,元组,字典,集合的总结)
  • 【CSS】设置滚动条样式
  • 【源码解析】Java NIO 包中的 MappedByteBuffer