当前位置: 首页 > 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后面还要+空格(标准化)。

相关文章:

  • 使用 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+源码+系统演示视频+安装说明)
  • 每天一道面试题-两数之和
  • 《尤物公园》连演8场:观众上台,每一场演出都独一无二
  • 城管给商户培训英语、政银企合作纾困,上海街镇这样优化营商环境
  • 咖啡戏剧节举办第五年,上生新所“无店不咖啡,空间皆可戏”
  • 公募基金行业迎系统性变革:基金公司业绩差必须少收费
  • 国家矿山安全监察局发布《煤矿瓦斯防治能力评估办法》
  • 上海市委政法委召开会议传达学习总书记重要讲话精神