Leetcode面试经典150题-28.找出字符串第一个匹配项的下标

解法都在代码里,不懂就留言或者私信,比第一题稍微难点

用KMP解这个题简直就像大炮打蚂蚁,但是没办法,现在都是这么卷

java 复制代码
package dataStructure.bigFactory;

public class _28Strstr {
    public static int strStr(String s1, String s2) {
        /**健壮性判断*/
        if(s1 == null || s2 == null) {
            return -1;
        }
        /**你比我还大,我怎么可能在内部找到你*/
        if(s2.length() > s1.length()) {
            return -1;
        }
        /**都转成字符数组*/
        char[] sArr1 = s1.toCharArray();
        char[] sArr2 = s2.toCharArray();
        /**获取s2的next数组,整个kmp的核心*/
        int[] next = generateNextArr(sArr2);
        /**pos1和pos2分别代表s1和s2正在匹配的位置*/
        int pos1 = 0;
        int pos2 = 0;
        /**下面开始匹配的过程*/
        while(pos1 < sArr1.length && pos2 < sArr2.length) {
            if(sArr1[pos1] == sArr2[pos2]) {
                pos1 ++;
                pos2 ++;
            } else if(next[pos2] != -1) {
                /**如果还可以回跳,就回跳(不是0位置)*/
                pos2 = next[pos2];
            } else {
                /**不能回跳的时候,表示0~pos1区间找不到这样的开头*/
                pos1 ++;
                /**这个时候pos2肯定是0*/
            }
        }
        /**出循环有两种可能:1.pos1越界了 2.pos2越界了
         * 如果pos1越界代表死都没匹配上,返回-1,pos2越界表示匹配结束找到了可以返回对应的开始位置
         * 我们把现在的pos1往前sArr2.length个就是开始的位置(因为pos1当前是匹配位置的下一个)*/
        return pos2 == sArr2.length? pos1-sArr2.length : -1;
    }

    public static int[] generateNextArr(char[] s2) {
        if(s2.length == 1) {
            return new int[]{-1};
        }        
/**next数组代表最长的前缀和后缀可以匹配的长度,前缀和后缀都不包含整个字符串*/
        int[] next = new int[s2.length];
        /**这个写死,是我们的规定*/
        next[0] = -1;
        next[1] = 0;
        /**aabaaac*/
        int index = 2;
        //这个变量有两个含义:1.从0到index-1这个子数组前缀串和后缀串的最大匹配长度
        //2.计算index的next的值的时候和index-1位置比较的位置
        int nextPosOfPrevious = 0;
        while(index < s2.length) {
            if(s2[index - 1] == s2[nextPosOfPrevious]) {
                next[index ++] = ++nextPosOfPrevious;
            } else if(next[nextPosOfPrevious] >= 0) {
                nextPosOfPrevious = next[nextPosOfPrevious];
            } else {
                next[index ++] = 0;
            }
        }
        return next;
    }

    public static void main(String[] args) {
        String s1 = "aabcca";
        String s2 = "abc";
        System.out.println(strStr(s1,s2));
    }
}

运行结果

最近确实没时间查到底是字节第几高的题了,稍后补充吧

也许KMP这个大家没太懂,过几天有空了我专门写一下KMP的文章解释一下,到时候还以这个为例子

相关推荐
Data_agent5 分钟前
京东商品价格历史信息API使用指南
java·大数据·前端·数据库·python
Knight_AL9 分钟前
Java 17 新特性深度解析:记录类、密封类、模式匹配与增强的 switch 表达式对比 Java 8
java·开发语言
最贪吃的虎13 分钟前
Spring Boot 自动装配(Auto-Configuration)深度实现原理全解析
java·运维·spring boot·后端·mysql
努力学算法的蒟蒻15 分钟前
day43(12.24)——leetcode面试经典150
算法·leetcode·面试
Ahuuua16 分钟前
Spring Bean作用域深度解析
java·后端·spring
大学生资源网16 分钟前
基于Vue的网上购物管理系统的设计与实现(java+vue+源码+文档)
java·前端·vue.js·spring boot·后端·源码
qq_124987075318 分钟前
基于微信小程序的私房菜定制上门服务系统(源码+论文+部署+安装)
java·spring boot·微信小程序·小程序·毕业设计·毕设
a努力。19 分钟前
京东Java面试被问:Fork/Join框架的使用场景
java·开发语言·面试
元亓亓亓30 分钟前
LeetCode--279. 完全平方数--中等
算法·leetcode·动态规划
有一个好名字34 分钟前
Spring AI 工具调用(Tool Calling):解锁智能应用新能力
java·人工智能·spring