首页 > 其他分享 >28.找出字符串中第一个匹配项的下标——学习笔记

28.找出字符串中第一个匹配项的下标——学习笔记

时间:2023-05-26 21:37:10浏览次数:47  
标签:下标 int needle 28 next 字符串 haystack

题目:给你两个字符串 haystackneedle ,请你在 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 <= $10^4$
  • haystack 和 needle 仅由小写英文字符组成

题目来源:力扣(LeetCode)链接

题解:

  • 方法一:暴力匹配
class Solution {
    public int strStr(String haystack, String needle) {
        int l1 = haystack.length();
        int l2 = needle.length();
        // 如果要找的字符串比被找的字符串长,就直接返回-1
        if (l1 < l2) {
            return -1;
        }
        char[] arr = needle.toCharArray();
        // 遍历被查找的字符串
        for (int i = 0; i < l1; i++) {
            int index = 0;
            // 如果第一个字符匹配就继续查找,一旦有不匹配的就退出内层循环
            for (int j = i; j < i + l2; j++) {
                if (haystack.charAt(j) == arr[index]) {
                    index++;
                } else {
                    break;
                }
            }
            // 内层循环结束,如果 index=l2 说明找到了,此时 i 就是第一个匹配的下标
            if (index == l2) {
                return i;
            }
        }
        // 如果循环结束,且没有返回,则说明没有找到
        return -1;
    }
}
  • 方法二:KMP 算法 (参考代码随想录里面的讲解点我跳转)
class Solution {
    public int strStr(String haystack, String needle) {
        // 如果 needle 字符串为 null 或 "",则直接返回 0
        if (needle.length() == 0) {
            return 0;
        }
        // 调用方法得到 needle 的前缀表
        int[] next = new int[needle.length()];
        getNext(next, needle);
        // 指针 j 表示 needle 的下标
        int j = 0;
        // 遍历字符串 haystack
        for (int i = 0; i < haystack.length(); i++) {
            // 如果字符不匹配,指针 j 就根据前缀表 next 回退
            while (j > 0 && haystack.charAt(i) != needle.charAt(j)) {
                j = next[j - 1];
            }
            // 如果字符匹配,那么 i 和 j 同时向后移动
            if (haystack.charAt(i) == needle.charAt(j)) {
                j++;
            }
            // 如果 j 等于字符串 needle 的长度,则说明第一次完全匹配,返回对应的下标
            if (j == needle.length()) {
                return i - needle.length() + 1;
            }
        }
        // 如果字符串遍历完成后,依然没有返回,则说明没找到
        return -1;
    }
    // 获取 needle 的前缀表
    public void getNext (int[] next, String s) {
        // j 的初始值对应长度为前 1 个字符的子串的最长相同前后缀
        int j = 0; 
        // 长度为前 1 个字符的子串,最长相同前后缀为 0
        next[0] = j;
        // 遍历字符串 needle 直接从下标 1 开始
        for (int i = 1; i < s.length(); i++) {
            // 如果前后缀不相同,那么 j 就要回退,一直到相等时结束
            while (j > 0 && s.charAt(j) != s.charAt(i)) {
                j = next[j - 1];
            }
            // 如果前后缀相等,就用 j 记录
            if (s.charAt(i) == s.charAt(j)) {
                j++;
            }
            // 把长度为前 i 个字符的子串,最长相同前后缀记录到 next 数组对应的位置
            next[i] = j;
        }
    }
}

标签:下标,int,needle,28,next,字符串,haystack
From: https://www.cnblogs.com/benben-home/p/17432913.html

相关文章

  • 剑指Offer58-II.左旋转字符串——学习笔记
    题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例1:输入:s="abcdefg",k=2输出:"cdefgab"示例2:输入:s="lrloseum......
  • 8. 字符串转换整数 (atoi)
    请你来实现一个myAtoi(strings)函数,使其能将字符串转换成一个32位有符号整数(类似C/C++中的atoi函数)。函数myAtoi(strings)的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正数。......
  • GB28181协议EasyGBS国标视频云服务平台断流问题的解决方法
    国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格......
  • Jmeter函数助手28-urldecode
    urldecode函数用于解码application/x-www-form-urlencoded字符串。StringtoencodeinURLencodedchars:填入application/x-www-form-urlencoded字符串 1、urlencode函数将字符进行编码格式化,而urldecode函数则是将编码进行解码,两者功能刚好相反。${__urlencode(value="......
  • 查找某个字符在字符串中出现的次数
    方法一:利用正则的match方法varstr="heleleoworled";varcount=(str.match(/le/g)||[]).length;console.log(count);方法二:先把要找的字符替换为空,然后用前一个字符串的长度减去后一个字符串的长度,除以要查找的字符串的长度。varstr1="heleleoworled";vartarget="l......
  • 字符串strip方法:只要头尾包含有指定字符序列中的字符就删除
    mystr='\n\tthisisacat\n\r'mystr=mystr.strip()#默认去掉两头的空格、换行符\n,制表符\t、回车符\rprint(mystr)#只要头尾包含有指定字符序列中的字符就删除mystr='1213HelloWord2331'mystr=mystr.strip('123')#strip会把‘123’三个元素中的随便......
  • [技术分享]Android平台音视频推送选RTMP还是GB28181?
    技术背景早在2015年,我们发布了RTMP直播推送模块,那时候音视频直播这块场景需求,还不像现在这么普遍,我们做这块的初衷,主要是为了实现移动单兵应急指挥系统的低延迟音视频数据传输。好多开发者可能会疑惑,走RTMP怎么可能低延迟?网上看到的RTMP推拉流延迟,总归要2-3秒起,如果是自己实现框架,R......
  • OverTheWire攻关过程-Bandit模块28
    我们打开lv27-lv28,查看信息机器翻译有一个git仓库在ssh://bandit27-git@localhost/home/bandit27-git/repo经由端口2220。用于用户匪27-git的密码与用于用户匪27的相同。克隆存储库并找到下一级别的密码。我们登陆服务器没有发现文件我们查看信息ssh://bandit27-git@localhost/ho......
  • P4288 [SHOI2014]信号增幅仪 题解
    感谢审核人Description给定\(n\)个点,椭圆长轴的方向\(a\)和放大倍数\(p\),求覆盖全部点的最小椭圆的半短轴长度。Solution让我们求最小覆盖椭圆,但是椭圆不具有什么好的性质,我们可以把椭圆转化成圆来做,这样,题目就转化成了最小覆盖圆,这个用随机增量法来做就可以了。接下来......
  • [ABC287D] Match or Not 题解
    Description翻译给的很明白了,就是让你判断\(S\)串的前\(x(0\leqx\leq|T|)\)个字符和后\(|T|-x\)个字符组成的字符串和\(T\)串是否相等,其中问号能代替所有字母。Solution很有意思的一道题。首先我们可以知道,如果前\(i-1\)位不能匹配的话,那么第\(i\)位不管它本......