[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;

    }
}
相关推荐
兰令水12 分钟前
leecodecode【回溯子集】【2026.6.4打卡-java版本】
java·开发语言·深度优先
fox_lht14 分钟前
14.3.重构
开发语言·后端·rust
牛油果子哥q34 分钟前
【C++ const 】全场景深度精讲:修饰规则、底层常量折叠、指针 / 引用 / 成员函数实战、易错坑点与工程代码实现
开发语言·c++
闪电悠米37 分钟前
黑马点评-Redisson-02_reentrant_lock
java·spring boot·redis·分布式·缓存
凌波粒39 分钟前
LeetCode--236. 二叉树的最近公共祖先(二叉树)
算法·leetcode·职场和发展
云烟成雨TD40 分钟前
Spring AI Alibaba 1.x 系列【67】ReactAgent SSE 流式输出
java·人工智能·spring
天天进步20151 小时前
Python全栈项目--社区问答平台
开发语言·python·django
我登哥MVP1 小时前
Spring Boo从“会用”到“精通”:Spring Boot 入门
java·spring boot·后端·spring·maven·intellij-idea·mybatis
skywalk81631 小时前
Tree-sitter是一个解析器生成器工具和一个增量解析库。它可以为源文件构建具体的语法树,并在编辑源文件时有效地更新语法树
开发语言·编程
染翰1 小时前
Java 实现 Git 自动克隆工具,打包成 Windows 独立 EXE(免安装JDK)
java·git·后端