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

    }
}
相关推荐
随便发挥34 分钟前
Leetcode 剑指 Offer II 186. 文物朝代判断
leetcode
6Hzlia1 小时前
【Classic 150 刷题计划】 LeetCode 205. 同构字符串 | C++ 双向绑定与哈希表映射
c++·算法·leetcode
伍一512 小时前
hiprint-spring-boot打印组件介绍
java·hiprint
神仙别闹7 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
Wang's Blog7 小时前
Java 接入Redis: 服务启动停止与后台运行配置
java·服务器·redis
此时不提桶,更待何时7 小时前
01-04-B-垃圾回收面试与生产事故实战
java·jvm·面试
伞伞悦读7 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
鹿角片ljp9 小时前
KV Cache 解析
java·算法
captain3769 小时前
网络原理(9)-数据链路层
java·网络协议·java-ee