LeetCode--459.重复的子字符串(字符串/KMP算法)

459.重复的子字符串

题目描述

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

复制代码
输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。

示例 2:

复制代码
输入: s = "aba"
输出: false

示例 3:

复制代码
输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)

提示:

  • 1 <= s.length <= 104
  • s 由小写英文字母组成

解题思路

利用KMP算法,找到与最长相等前后缀子串互补的子串:

代码

java 复制代码
class Solution {

    public boolean repeatedSubstringPattern(String s) {
        int len = s.length();
        int[] next = new int[len];
        // 初始化
        int j = 0;
        next[0] = j;
        for(int i=1; i<len; i++){
            // 最长前缀和最长后缀不匹配
            // 这里只关注第i个字符左侧字符串(不包含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;
        }
        if(next[len-1] != 0 && len % (len - next[len - 1] ) == 0)
        return true;

        return false;
    }
}
相关推荐
圣保罗的大教堂2 分钟前
leetcode 2161. 根据给定数字划分数组 中等
leetcode
插件开发35 分钟前
矢量路径运算如何选GPU技术?——适用算法对比及OpenGL/Direct3D/CUDA选型指南
算法·3d
我爱cope37 分钟前
【Agent智能体23 | 规划-规划工作流】
人工智能·设计模式·语言模型·职场和发展
8Qi81 小时前
LeetCode 72:编辑距离(Edit Distance)—— 题解
算法·leetcode·职场和发展·动态规划
SoftLipaRZC1 小时前
顺序表的应用:通讯录项目与经典算法实战
算法
8Qi81 小时前
LeetCode 583. 两个字符串的删除操作
算法·leetcode·职场和发展·动态规划
tigershang1 小时前
卡尔曼滤波:不确定世界中的最优估计
人工智能·算法·机器学习
一个儒雅随和的男子1 小时前
限流算法详细剖析
java·服务器·算法
工业胶粘剂技术2 小时前
单组分高温环氧结构胶 K-EP280 完整技术参数与工程选型分析
算法·制造
小欣加油3 小时前
Leetcode31 下一个排列
数据结构·c++·算法·leetcode·职场和发展