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

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

题解一

思路

双层循环暴力解,只要needle的第一位和haystack的某一位对应,就进入内循环,如果超限或者某一位不同,跳出内循环,继续寻找下一个和needle第一位匹配的字符。

代码

class Solution {
    public int strStr(String haystack, String needle) {
        for(int i = 0; i < haystack.length(); i++){
            if(haystack.charAt(i) == needle.charAt(0)){
                for(int j = 0; j < needle.length(); j++){
                    if(i + j > haystack.length() - 1 || haystack.charAt(i + j) != needle.charAt(j)) break;
                    if(j == needle.length() - 1) return i;
                }
            }
        }
        return -1;
    }
}

总结

时间复杂度O(mn),空间复杂福挺简单的,没啥要总结的。

题解二

思路

据说这个题是KMP算法的经典应用场景。

代码

class Solution {
    public int strStr(String haystack, String needle) {
        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;
    }

    public void getNext(int[] next, String s){
        next[0] = 0;
        int j = 0;

        for(int i = 1; i < s.length(); i++){
            while(j > 0 && s.charAt(i) != s.charAt(j)){
                j = next[j - 1];
            }
            if (s.charAt(i) == s.charAt(j)){
                j++;
            }
            next[i] = j;
        } 
    }
}

总结

时间复杂度O(m+n),KMP算法太强了,有时间我一定要专门开个帖子讲讲我对KMP的理解。(开个超级大坑)

KMP简直太神了,巧夺天工。

ps:第一次知道if后面还要+空格(标准化)。

http://www.dtcms.com/a/77689.html

相关文章:

  • 使用 PIC 微控制器和 Adafruit IO 的基于 IoT 的 Web 控制家庭自动化
  • 在大数据开发中ETL是指什么?
  • 网络编程-实现客户端通信
  • conda相关总结
  • 基于Spring Boot的图书管理系统的设计与实现(LW+源码+讲解)
  • 蓝桥杯真题——洛谷Day13 找规律(修建灌木)、字符串(乘法表)、队列(球票)
  • 如何制作一个自己的网站?
  • Excel 小黑第12套
  • 【华为OD-E卷 - 求符合条件元组个数 100分(python、java、c++、js、c)】
  • Redis高级结构-布隆过滤器
  • 【量化科普】Alpha,阿尔法收益
  • laravel 对 数据库 json 字段的查询方式汇总
  • 在 Offset Explorer 中配置多节点 Kafka 集群的详细指南
  • gralloc usage flags
  • 关于QMetaObject::invokeMethod的作用和用法
  • Rust 生命周期
  • 【深度学习与大模型基础】第7章-特征分解与奇异值分解
  • python鸢尾花
  • 基于java的ssm+JSP+MYSQL的九宫格日志网站(含LW+PPT+源码+系统演示视频+安装说明)
  • 每天一道面试题-两数之和
  • SpatialLM尝鲜版
  • JavaEE的知识记录
  • Python第六章03:列表的常用操作
  • 【AI知识】常见的优化器及其原理:梯度下降、动量梯度下降、AdaGrad、RMSProp、Adam、AdamW
  • 线程池学习
  • 如何在Linux中实现scp命令自动输入密码
  • 使用Trae 生成的React版的贪吃蛇
  • 算法刷题记录——LeetCode篇(2) [第101~200题](持续更新)
  • android MutableLiveData setValue 响应速速 postValue 快
  • Collection系列集合的小结+集合并发修改异常问题