首页 > 其他分享 >459.重复的子字符串——学习笔记

459.重复的子字符串——学习笔记

时间:2023-05-26 21:37:17浏览次数:38  
标签:子串 459 重复 len next int 笔记 字符串

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

示例 1:

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

示例 2:

输入: s = "aba"
输出: false

示例 3:

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

提示:

  • 1 <= s.length <= $10^4$
  • s 由小写英文字母组成

题目来源:力扣(LeetCode)链接

题解:

  • 方法一:移动匹配
    字符串 abcabc
    img
class Solution {
    public boolean repeatedSubstringPattern(String s) {
        // 拼接 s+s,去除 s+s 的首字母和尾字符
        String t = (s + s).substring(1, 2 * s.length() - 1);
        // 如果新字符串里面还有一个 s,则说明 s 是由重复字符串组成的
        return t.contains(s);
    }
}
  • 方法二:KMP 算法
    在由重复子串组成的字符串中,最长相等前后缀不包含的子串就是最小重复子串
    img
    • 举例说明
      img
class Solution {
    public boolean repeatedSubstringPattern(String s) {
        // 如果为 "",直接返回 false
        if (s.equals("")) {
            return false;
        }
        int len = s.length;
        // 求出字符串 s 的前缀表
        int[] next = new int[len];
        int j = 0;
        next[0] = j;
        for (int i = 0; i < len; i++) {
            while (j > 0 && s.charAt(i) != s.charAt(j)) {
                j = next[j];
            }
            if (s.charAt(i) == s.charAt(j)) {
                j++;
            }
            next[i] = j;
        }
        // 如果最长相同前后缀不为 0,且字符串长度是最长相等前后缀不包含的子串长度的倍数
        // 就说明字符串是由最长相等前后缀不包含的子串重复组成的
        if (next[len - 1] > 0 && len % (len - next[len - 1]) == 0) {
            return true;
        }
        return false;
    }
}

标签:子串,459,重复,len,next,int,笔记,字符串
From: https://www.cnblogs.com/benben-home/p/17433098.html

相关文章

  • 28.找出字符串中第一个匹配项的下标——学习笔记
    题目:给你两个字符串 haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果 needle不是haystack的一部分,则返回 -1。示例1:输入:haystack="sadbutsad",needle="sad"输出:0解释:"sad"在下标0和6处匹配。第一个......
  • 剑指Offer58-II.左旋转字符串——学习笔记
    题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例1:输入:s="abcdefg",k=2输出:"cdefgab"示例2:输入:s="lrloseum......
  • 8. 字符串转换整数 (atoi)
    请你来实现一个myAtoi(strings)函数,使其能将字符串转换成一个32位有符号整数(类似C/C++中的atoi函数)。函数myAtoi(strings)的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正数。......
  • ThreadLocal源码学习笔记
    系列文章目录和关于我一丶ThreadLocal结构#每一个Thread对象都有一个名为threadLocals类型为ThreadLocal.ThreadLocalMap的属性,ThreadLocal.ThreadLocalMap对象内部存在一个Entry数组,其中存储的Entry对象key是ThreadLocal,value便是我们绑定在线程上的值。ThreadLocal可以做......
  • 极光笔记 | EngageLab Push的多时区解决方案
    01、引言多时区问题一直是全球客户和终端用户面临的挑战之一。EngageLabPush致力于解决这个问题,确保全球各地的终端用户可以平等地享受到同样的推送服务,同时让客户能够更好地管理不同时区的应用和对应的终端用户。02、解决多时区问题的总体方案1、在服务器端,所有涉及时间的信息统......
  • 构建之法阅读笔记02
    《现代软件工程构建之法》第二章个人技术和流程,主要介绍如何通过良好的个人技术和流程,提高软件开发的效率和质量。在阅读本章后,我对自己过去在这方面的做法有了更深刻的反思和认识,同时也为自己今后的软件开发提出了更加理性和有效的解决方案。个人感受:我过去是怎样做的在个人技术......
  • 构建之法阅读笔记03
    《现代软件工程构建之法》第三章软件工程师的成长,主要介绍了软件工程师的技能、素质和职业发展规划。在阅读本章后,我对自己过去在这些方面的发展还有待提高,同时也得到了一些有益的启发和建议,可以帮助我更好地成长和发展。个人感受:我过去是怎样做的在软件开发的过程中,我过去往往注......
  • 构建之法阅读笔记01
    《现代软件工程构建之法》第一章概论介绍了软件工程的概念、软件危机及其原因,以及现代软件工程的目标、方法和原则。阅读完本章后,我深刻认识到以往自己在软件开发中存在的问题,也对如何提高软件开发的效率和质量有了更深入的思考。个人感受:我过去是怎样做的在实际的软件开发过程中,......
  • 【笔记】macbook m2 芯片中使用 gcc docker 镜像来交叉编译
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯一个c程序,如何在macbookm2芯片的笔记本上,编译成linuxamd64的二进制格式呢?用gcc的docker镜像轻松的解决了这个问题:#下载gcc镜像,并且是linuxamd64......
  • Java笔记(十):函数式接口
    函数式接口有且仅有一个抽象方法的接口JDK8中,只有一个抽象方法的接口称为函数式接口,我们就能使用Lambda。针对一个接口中,是否有大于一个抽象方法?JDK8为我们新增了一个注解:@FunctionalInterface。它能够帮助我们检测这个接口是不是只有一个抽象方法,如果有两个抽象方法,则会报......