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

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

  • 原题链接:
  • 完成情况:
  • 解题思路:
  • 参考代码:
    • __28找出字符串中第一个匹配项的下标__滑动窗口
    • __28找出字符串中第一个匹配项的下标__前缀表_前缀表_不减1
    • __28找出字符串中第一个匹配项的下标__前缀表_前缀表_减1
  • 错误经验吸取

原题链接:

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

https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/

完成情况:

在这里插入图片描述

解题思路:

/**
 * 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。
 * 如果 needle 不是 haystack 的一部分,则返回  -1 。
 *
 * @param haystack
 * @param needle
 * @return
 */


    //在字符串haystack中找出needle字符串的第一个匹配项的下标
    //模拟匹配算法?
    /**
     * 基于窗口滑动的算法
     * <p>
     * 时间复杂度:O(m*n)
     * 空间复杂度:O(1)
     * 注:n为haystack的长度,m为needle的长度
     */

参考代码:

__28找出字符串中第一个匹配项的下标__滑动窗口

package 代码随想录.字符串;

public class __28找出字符串中第一个匹配项的下标__滑动窗口 {
    /**
     * 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。
     * 如果 needle 不是 haystack 的一部分,则返回  -1 。
     *
     * @param haystack
     * @param needle
     * @return
     */
    public int strStr(String haystack, String needle) {
        //在字符串haystack中找出needle字符串的第一个匹配项的下标
        //模拟匹配算法?
        /**
         * 基于窗口滑动的算法
         * <p>
         * 时间复杂度:O(m*n)
         * 空间复杂度:O(1)
         * 注:n为haystack的长度,m为needle的长度
         */
        int m = needle.length();
        if (m == 0) {
            return 0;   //空串是任意字符串的0匹配子串
        }
        int n = haystack.length();
        if (n<m){   //如果haystack的长度小于needle的长度,直接返回-1
            return -1;
        }
        int i = 0;
        int j = 0;
        //最多找到这个位置为止
        while (i<n-m+1){
            //找出第一个匹配的位置
            while (i<n-m+1 && haystack.charAt(i) != needle.charAt(j)){
                i++;
            }
            if (i>=n-m+1){   //检查i是否还合理
                return -1;
            }
            //遍历后续字符,判断是否相等
            while (i<n && j<m && haystack.charAt(i)==needle.charAt(j)){
                i++;
                j++;    //j指向下一个匹配的字符
            }
            if (j==m){  //说明完全匹配
                return i-j;
            }else{
                //并不能完全匹配
                i-=j-1; //跳过当前j-1get匹配的字符   //因为这道题没有说明时间限制,因此这里采用的是逐个遍历
                j = 0;
            }
        }
        return -1;
    }
}

__28找出字符串中第一个匹配项的下标__前缀表_前缀表_不减1

package 代码随想录.字符串;

public class __28找出字符串中第一个匹配项的下标__前缀表_前缀表_不减1 {
    //前缀表(不减一)Java实现
    public int strStr(String haystack, String needle){
        if (needle.length() == 0){
            return 0;
        }
        if (needle.length() > haystack.length()){
            return -1;
        }
        int[] next = new int[needle.length()];  //构造数组,进行模式匹配
        getNext(next, needle);
        int j = 0;
        for (int i = 0; i < haystack.length(); i++){
            while (j > 0 && haystack.charAt(i)!= needle.charAt(j)){
                j = next[j-1];
            }
            if (haystack.charAt(i) == needle.charAt(j)){
                j++;
            }
            if (j == needle.length()){
                return i - needle.length() + 1;
            }
        }
        return -1;
    }

    /**
     *
     * @param next
     * @param string
     */
    private void getNext(int[] next, String string) {
        next[0] = 0;
        int j = 0;
        for (int i = 1; i < string.length(); i++) {
            while (j > 0 && string.charAt(i)!= string.charAt(j)) {
                j = next[j-1];
            }
            if (string.charAt(i) == string.charAt(j)) {
                j++;
            }
            next[i] = j;
        }

    }
}

__28找出字符串中第一个匹配项的下标__前缀表_前缀表_减1

package 代码随想录.字符串;

public class __28找出字符串中第一个匹配项的下标__前缀表_前缀表_减1 {
    public int strStr(String haystack, String needle) {
        if (needle.length() == 0) {
            return 0;
        }
        if (haystack.length() < needle.length()) {
            return -1;
        }

        int[] next = new int[needle.length()];  //构造数组,进行模式匹配
        getNext(next, needle);
        int j = -1;
        for (int i = 0; i < haystack.length(); i++) {
            while (j>=0 && haystack.charAt(i)!= needle.charAt(j + 1)) {
                j = next[j];
            }
            if (haystack.charAt(i) == needle.charAt(j + 1)) {
                j++;
            }
            if (j == needle.length() - 1) {
                return i - needle.length() + 1;
            }
        }
        return -1;
    }

    /**
     *
     * @param next
     * @param string
     */
    private void getNext(int[] next, String string) {
        next[0] = -1;
        int j = -1;
        for (int i = 1; i < string.length(); i++) {
            while (j >= 0 && string.charAt(i)!= string.charAt(j + 1)) {
                j = next[j];
            }
            if (string.charAt(i) == string.charAt(j + 1)) {
                j++;
            }
            next[i] = j;
        }
    }
}

错误经验吸取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/132057.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c语言,将奇数和偶数分类

题目&#xff1a;输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 思路&#xff1a;像冒泡排序那样&#xff0c;相邻两个数比较&#xff0c;两个都是偶数则不…

常见问题: (Windows/app/浏览器)总结及其研究———(不断更新中.....)

问题目录 手机电脑电脑qq如何多开分身电脑与手机无线传送数据的方法 浏览器下载如何利用技术下载网上图片 WindowsVMware Workstation1 无法创建11264MB的匿名分页文件&#xff1a;页面文件2 虚拟机安装Windows11时出现: tempting to start up from: EFI VMware Virtual N 百度…

Python基础教程:类--继承和方法的重写

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 什么是继承 继承就是让类与类之间产生父子关系&#xff0c;子类可以拥有父类的静态属性和方法 继承就是可以获取到另一个类中的静态属性和普通方法&#xff08;并非所有成员&#xff09; 在python中&#xff0c;新建的类可…

【代码随想录】算法训练计划17

1、 110.平衡二叉树 题目&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 思路&#xff1a; 经典后序遍历&#xff0c;感…

【已验证-直接用】微信小程序wx.request请求服务器json数据并渲染到页面

微信小程序的数据总不能写死吧&#xff0c;肯定是要结合数据库来做数据更新&#xff0c;而小程序数据主要是json数据格式&#xff0c;所以我们可以利用php操作数据库&#xff0c;把数据以json格式数据输出即可。 现在给大家讲一下微信小程序的wx.request请求服务器获取数据的用…

Vue3-组合式API生命周期函数

一进入页面的请求一律放在setup中执行 如果有些代码需要在mounted生命周期中执行&#xff0c;并且写成函数的调用方式可以调用多次&#xff0c;并不会冲突&#xff0c;而是按照顺序依次执行 <script setup>onMounted(()>{console.log("mounted生命周期函数-逻辑…

GPU CUDA 使用shared memory 运行速度不升反降原因与解决方案

写了两张图像相加&#xff0c;以及图像滤波的的几个算子&#xff0c;分别采用shared memory 进行优化。 #include <stdio.h> #include <cuda_runtime.h>#include "helper_cuda.h" #include "helper_timer.h"#define BLOCKX 32 #define BLOCKY…

永达理简析:利用保险的“财务规划”功能维持退休后生活水平

现代社会环境背景下&#xff0c;“自养自老”已经是一种未来养老趋势&#xff0c;很多人会为自己准备一份长期、比较周全的保障&#xff0c;这样财务规划不仅会分担子女的压力&#xff0c;也让自己有一个长远的保障。在各种财务储蓄工具中&#xff0c;商业保险占据着不可取代的…

Redis实现分布式锁

文章目录 前言一、概述为什么使用分布式锁基本原理分布式锁应该具备哪些条件常见的三种分布式锁 二、基于Redis实现分布式锁误删锁问题原子性问题最终代码实现 总结 前言 Redis实现简单分布式锁。 一、概述 为什么使用分布式锁 在多线程环境中&#xff0c;如果多个线程同时访…

2023 年最好的 Android 系统修复/刷机应用程序和软件

任何 Android 设备要顺利运行&#xff0c;其操作系统必须运行良好。幸运的是&#xff0c;对于大多数 Android 用户来说&#xff0c;这是不间断的。设备运行良好&#xff0c;打电话、共享文档等都没有问题。尽管如此&#xff0c;Android 操作系统可能会停止运行。这可能是由于特…

HTTP-FLV详解及分析

文章目录 前言一、HTTP-FLV 简介1、市场上使用 http-flv 的商家2、http-flv、rtmp 和 hls 直播的优缺点3、http-flv 技术实现 二、Nginx 配置 http-flv1、Windows 安装 nginx&#xff0c;已经集成 nginx-http-flv-module2、nginx.conf 配置文件3、运行 nginx 服务器4、ffmpeg 推…

Windows系统安装2个版本得的MySQL

一、MySQL官网下载对应版本的zip文件 最新版本8.0.34下载链接&#xff1a;https://dev.mysql.com/downloads/mysql/ MySQL 5.7下载链接&#xff1a;https://downloads.mysql.com/archives/community/ 二、将下载到的压缩包解压到指定目录 使用解压工具将下载到的压缩包解…

开源Gimp动态压感笔刷设置方法

一、问题描述 开源绘画工具的Gimp的笔刷压感在哪里控制和开启呢&#xff1f; 二、解决方法 1、Gimp有专用的笔刷集&#xff1a;如下图。开启需要在主窗口window下拉菜单开启&#xff0c;或在右侧面板里的左箭头按钮里打开。一般绘画够用了。比用自定义特殊笔刷。 2、如果要调…

C++:this指针和构造与析构的运用

目录 一&#xff0c;this指针 二&#xff0c;构造函数 三&#xff0c;析构函数 四&#xff0c;析构与构造的调用 一&#xff0c;this指针 首先&#xff0c;我们先观察以下类&#xff1a; #include <iostream> using namespace std; class Date { public: void In…

HCIA-hybrid经典小实验

hybrid经典小实验 实验拓扑配置实现SW1SW2 配置验证PC1-PC3 不能通信PC1-PC2 正常通信其他自行测试 实验拓扑 配置实现 SW1 sysname SW1 # undo info-center enable # vlan batch 10 20 30 # interface Ethernet0/0/1 //接口发送该vlan-id的数据帧时&#xff0c;不剥离帧中的…

JavaSE 类与对象

前言 我们之前学的都是面向过程&#xff0c;面向过程研究的是对单个对象的一种方法实现过程&#xff0c;比如求一个数的阶乘&#xff0c;强调的是怎么实现这个方法的过程&#xff0c;但对我们以后来说&#xff0c;如果想要应用到更广的层面&#xff0c;不能只是学习一个方法的…

JMeter 常见函数讲解

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;加入1000人软件测试技术学习交流群&#x1f4e2;资源分享&#xff1a;进了字节跳动之后&#xff0c;才…

宠物社区系统宠物领养小程序,宠物救助小程序系统多少钱?

当前很多的宠物被抛弃和虐杀&#xff0c;它们没有选择权&#xff0c;我们强制性的把狗带进人类的生活中&#xff0c;然后又无情的抛弃&#xff0c;让它们无家可归&#xff0c;变成流浪狗&#xff0c;它们做错了什么&#xff1f;流浪动物被主人遗弃之后居无定所&#xff0c;时刻…

C语言【趣编程】我们怎样便捷输出空心的金字塔

目录 1问题&#xff1a; 2解题思路&#xff1a; 3代码如下&#xff1a; 4代码运行结果如下图所示&#xff1a; 5总结&#xff1a; r如若后续有不会的问题&#xff0c;可以和我私聊&#xff1b; 1问题&#xff1a; 2解题思路&#xff1a; 方法&#xff1a;找规律&#xff0…

AI系统ChatGPT源码+详细搭建部署教程+AI绘画系统+支持GPT4.0+Midjourney绘画+已支持OpenAI GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…
最新文章