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

news/2024/7/5 3:41:20
例题:

分析:

题目的意思就是:

先给出一个字符串pattern,要拿着pattern字符串和原始字符串(origin)比对,若在origin中找到了pattern字符串,则返回pattern字符串在原始字符串origin中的下标。

                        

先拿着pattern和origin从第一个字符开始依次比对。

单个字符比对若一致, 继续往下比对其它字符。

直到找出第一个比对不成功情况,此时可以把 i 向右移动一位(i++), j 回到0索引,origin字符串从 i = 1索引开始重新和pattern比对,如下图:

重复上述步骤,在原始字符串(origin)中找到和pattern相同的部分,返回当前索引 i :

思路:

可以使用两个循环来依次比对,外层循环表示从原始字符串索引 i 开始和pattern进行比对,

注意:外层循环不必循环origin.length 次,循环origin.length - pattern.length 次即可。

代码实现:
package leetcode;

public class StrStrLeetcode28 {
    public static int strStr(String haystack, String needle) {
        char[] pattern = needle.toCharArray();
        char[] origin = haystack.toCharArray();
        int i = 0;  //原始数组的索引
        int j = 0;  //模式数组的索引
        while(i <= origin.length - pattern.length){
            for (j = 0; j < pattern.length; j++) {
                if(origin[i + j] != pattern[j]){
                    break;
                }
            }
            if(j == pattern.length){  //表示pattern字符串中的所有字符都成功匹配了origin
                return i;
            }
            i++;
        }
        return -1;
    }
    public static void main(String[] args) {
        System.out.println(strStr("aaacaaab", "aaab"));
    }
}


http://lihuaxi.xjx100.cn/news/1952742.html

相关文章

C++-拷贝构造函数

深拷贝与浅拷贝 浅拷贝&#xff1a;类中的缺省拷贝构造函数&#xff0c;对指针形式的成员变量按字节复制&#xff0c;而不会复制指针所指向的内容&#xff0c;这种拷贝方式称为浅拷贝。 #include <iostream> using namespace std;class Integer{ private:int m_i;publi…

走进shell

Linux系统启动时&#xff0c;会自动创建多个虚拟控制台。虚拟控制台是运行在Linux系统内存中的终端会话。 打开Linux控制台Terminal使用tty命令查看当前使用的虚拟控制台。 注&#xff1a;tty 表示电传打字机(teletypewriter) $ tty /dev/pts/0表示当前使用的是/dev/pts/0 虚拟…

vue使用sm2对手机号邮箱等加签名,数据完整性

vue使用sm2对手机号邮箱等加签名&#xff0c;数据完整性 1、安装依赖 npm install --save sm-crypto2、在utils文件下新建sm2Util.js // sm2Util.js const SM2 require(sm-crypto).sm2; const publicKey woshigongyao // 公钥 const privateKey woshisiyao // 私钥/* * 加…

66.网游逆向分析与插件开发-角色数据的获取-角色类的数据分析与C++还原

内容来源于&#xff1a;易道云信息技术研究院VIP课 ReClass.NET工具下载&#xff0c;它下方链接里的 逆向工具.zip 里的reclass目录下&#xff1a;注意它分x64、x32版本&#xff0c;启动是用管理员权限启动否则附加时有些进程附加不上 链接&#xff1a;https://pan.baidu.com/…

65、python - 利用手写的网络,成功预测一张图片

上面两节通过介绍了几种预处理方法,分别是 Resize and Crop 和 Normalization。在完成图像预处理之后,加上之前手动搭建的神经网络,其实我们就可以对图形进行推理识别了。 这一节我们使用自己手写的算法、自己搭建的神经网络,来第一次完成一张图像的识别。 下面对一些重要…

Springboot的配置文件详解:从入门到精通,解读配置文件的奇妙世界

目录 1、前言 2、介绍 2.1 Springboot配置文件的作用 2.2 Springboot支持的配置文件类型 2.3 Springboot配置文件的加载顺序 3、YAML配置文件 3.1 YAML基本语法介绍 3.2 YAML中的基本数据类型 3.3 YAML中的复合数据类型 3.4 YAML中的配置属性 3.5 YAML中的多环境配置…

网络协议与攻击模拟_03实施ARP欺骗和攻击

一、ARP攻击 1、实验环境 kali Linux &#xff08;安装arpspoof工具&#xff09;被攻击主机 2、kali配置 kali Linux系统是基于debian Linux系统&#xff0c;采用deb包管理方式&#xff0c;可以使用apt源的方式进行直接从源的安装。 配置kali网络源 vim /etc/apt/sources…

go 的内存布局和分配原理

go 之所以在高并发环境下表现优异&#xff0c;除了咱们都知道的 GMP 模型&#xff0c;其实 go 的内存布局和分配机制也起到了不少作用。 1. 分配内存三大组件 go 分配内存的过程&#xff0c;主要由三大组件所管理&#xff0c;级别从上到下分别是&#xff1a; mheap go 在程…