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

    }
}
相关推荐
Wang's Blog几秒前
Java 中间件之 RabbitMQ 快速入门: RabbitMQ 介绍与安装部署
java·中间件·java-rabbitmq
czq_26867194878 分钟前
Python打卡第34天
开发语言·python·机器学习
sibylyue13 分钟前
SQLite 运行模式
java·jvm·sqlite
专业程序开发源13 分钟前
django便利店外卖后台管理系统19650-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
JAVA面经实录91718 分钟前
Java高级后端 · 架构组件开发 + CodeReview(本岗位差异化核心)
java·架构·代码复审
toooooop820 分钟前
宝塔Python项目管理器:环境变量踩坑记录
java·jvm·python
代码山河23 分钟前
Java语言特点:跨平台、面向对象、安全性详解
java·学习·架构·教程·面向对象·项目
马剑威(威哥爱编程)27 分钟前
【AI全栈后端12-09】Spring Boot 用流式输出做打字机对话:点下去不再干等
java·人工智能·spring boot·后端
步行cgn29 分钟前
Spring 事务传播行为详解
java·数据库·spring
海宇服务30 分钟前
零信任架构实战:基于海宇车辆vin码查车辆信息详版构建自动化汽配云仓参配核验网关
java·人工智能·架构·自动化