代码随想录二刷第八天 | 28. 实现 strStr()、459.重复的子字符串

28. 实现 strStr()

题目:28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)

题解:代码随想录

状态:需要多复习,多看

思路

KMP算法,实现方式为next数组初始化为0,不减一

代码

时间复杂度:O(m + n) 空间复杂度:O(m)

java 复制代码
class Solution {
    public int strStr(String haystack, String needle) {
        if(needle.length() == 0) return 0;
        if(needle.length() > haystack.length()) return -1;

        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 - j + 1;
            }
        }

        return -1;
    }

    private static void getNext(int[] next, String s){
        int j = 0;
        next[0] = 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;
        }
    }
}

459.重复的子字符串

题目:459. 重复的子字符串 - 力扣(LeetCode)

题解:代码随想录

状态:需要结合KMP多看

思路

KMP算法+移动匹配。abcabc+abcabc,去掉开头和结尾,在其中找abcabc

代码

时间复杂度:O(m + n) 空间复杂度:O(m)

java 复制代码
class Solution {
    public boolean repeatedSubstringPattern(String s) {
        return kmp(s+s, s);
    }

    private boolean kmp(String str, String pattern){
        int[] next = new int[pattern.length()];
        next[0] = 0;
        int j = 0;
        for(int i = 1; i < pattern.length(); i++){
            while(j > 0 && pattern.charAt(i) != pattern.charAt(j)){
                j = next[j - 1];
            }
            if(pattern.charAt(i) == pattern.charAt(j)){
                j++;
            }
            next[i] = j;
        }

        j = 0;
        for(int i = 1; i < str.length() - 1; i++){
            while(j > 0 && str.charAt(i) != pattern.charAt(j)){
                j = next[j - 1];
            }
            if(str.charAt(i) == pattern.charAt(j)){
                j++;
            }
            if(j == pattern.length()){
                return true;
            }
        }

        return false;
    }
}
相关推荐
野蛮人6号11 分钟前
黑马微服务p10mybatisplus09核心功能iservice 测试文档无法正常打开
java·黑马微服务
危险、12 分钟前
《Java Stream 中 toMap 的生产级用法:一次 Duplicate key 的异常问题复盘》
java
古城小栈17 分钟前
Java 内存优化:JDK 22 ZGC 垃圾收集器调优
java·python·算法
福大大架构师每日一题20 分钟前
rust 1.92.0 更新详解:语言特性增强、编译器优化与全新稳定API
java·javascript·rust
xiaogc_a24 分钟前
【无标题】
java
源码技术栈30 分钟前
智慧工地微服务架构+Java+Spring Cloud +Uni-App +MySql开发,在微信公众号、小程序、H5、移动端
java·ai·saas·智慧工地·智慧工地项目·可视化大屏·智慧工地系统
老华带你飞33 分钟前
健身房预约|基于springboot 健身房预约小程序系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·小程序
帅得不敢出门37 分钟前
MTK Android11 APP调用OTA升级
android·java·开发语言·framework
李拾叁的摸鱼日常40 分钟前
ThreadLocal 内存泄漏深度解析:原因、避坑指南与业务最佳实践
java·面试
Kiri霧42 分钟前
Go Defer语句详解
java·服务器·golang