[Java][Leetcode simple] 28. 找出字符串中第一个匹配项的下标

暴力匹配

I 如果大于m - n则永远不可能有匹配成功的字符串(长度太短,不够匹配)

java 复制代码
class Solution {
   public  int strStr(String haystack, String needle) {
        int m = haystack.length();
        int n = needle.length();
        int cnt = 0;
        int tmp = 0;

        if( m < n) return -1;
    
        for(int i = 0 ;i<= m - n;i++){
            tmp = i;
            cnt = 0;

            while(cnt < n){
                if(haystack.charAt(tmp) == needle.charAt(cnt)){
                    tmp++;
                    cnt++;
                }else{
                    break;
                }
            }
            if(cnt == n){
                return i;
            }
        }

        return -1;

    }
}

KMP算法

和暴力匹配相比,暴力法一旦匹配失败,文本指针要回退、模式串也要从头开始,会做很多重复比较,效率不高。

而 KMP 最大的特点就是:文本指针永远不回退,只往前走。

它的核心思想是:利用模式串本身的前后缀重复信息,提前预处理出一个 next 数组,记录每个位置匹配失败后,模式串应该跳到哪里继续比较,而不是直接回到 0。

这样就避免了重复比较,把时间复杂度从暴力的 O (n*m) 优化到了 O(n + m),非常稳定高效。

java 复制代码
class Solution {
   public  int strStr(String haystack, String needle) {
        int m = haystack.length();
        int n = needle.length();
       
        
        if( n == 0) return 0;
        if( m < n) return -1;
    
        int[] next = new int[n];

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

             if(needle.charAt(i) == needle.charAt(j)){
                j++;
             }
             next[i] = j;
        }

        for( int i=0,j=0;i<m;i++){
            while(j>0 && haystack.charAt(i) != needle.charAt(j)){
                j = next[j-1];
            }

            if(haystack.charAt(i) == needle.charAt(j)){
                j++;
            }
            if(j==n){
                return  i - n +1;
            }
        }
        return -1;

    }
}
相关推荐
likerhood1 小时前
java中的不可变类(Immutable)
java·开发语言
Ulyanov1 小时前
《PySide6 GUI开发指南:QML核心与实践》 第一篇:GUI新纪元——QML与PySide6生态系统全景
开发语言·python·qt·qml·雷达电子对抗
Rust研习社2 小时前
从入门到实践:Rust 异步编程完全指南
开发语言·后端·rust
yaoxin5211232 小时前
389. Java IO API - 获取文件名
java·开发语言·python
Wang15303 小时前
Java排序
java
逸风尊者3 小时前
XGBoost模型工程使用
java·后端·算法
一嘴一个橘子3 小时前
MP 自定义业务方法 (二)
java
lhbian3 小时前
AI编程革命:Codex让脚本开发提速10倍
开发语言·汇编·jvm·c#
jiayong233 小时前
第 36 课:任务详情抽屉快捷改状态
开发语言·前端·javascript·vue.js·学习