459. 重复的子字符串

459. 重复的子字符串

  • 原题链接:
  • 完成情况:
  • 解题思路:
  • 参考代码:
    • __459重复的子字符串_枚举
    • __459重复的子字符串_字符串匹配
    • __459重复的子字符串_KMP算法
    • __459重复的子字符串_优化的KMP算法
  • 错误经验吸取

原题链接:

459. 重复的子字符串

https://leetcode.cn/problems/repeated-substring-pattern/submissions/

完成情况:

在这里插入图片描述

解题思路:

思路与算法

如果一个长度为 nnn 的字符串 sss 可以由它的一个长度为 n′n'n 
′
  的子串 s′s's 
′
  重复多次构成,那么:

nnn 一定是 n′n'n 
′
  的倍数;

s′s's 
′
  一定是 sss 的前缀;

对于任意的 i∈[n′,n)i \in [n', n)i∈[n 
′
 ,n),有 s[i]=s[i−n′]s[i] = s[i-n']s[i]=s[i−n 
′
 ]。

也就是说,sss 中长度为 n′n'n 
′
  的前缀就是 s′s's 
′
 ,并且在这之后的每一个位置上的字符 s[i]s[i]s[i],都需要与它之前的第 n′n'n 
′
  个字符 s[i−n′]s[i-n']s[i−n 
′
 ] 相同。

因此,我们可以从小到大枚举 n′n'n 
′
 ,并对字符串 sss 进行遍历,进行上述的判断。注意到一个小优化是,因为子串至少需要重复一次,所以 n′n'n 
′
  不会大于 nnn 的一半,我们只需要在 [1,n2][1, \frac{n}{2}][1, 
2
n
​
 ] 的范围内枚举 n′n'n 
′
  即可。

参考代码:

__459重复的子字符串_枚举

package 代码随想录.字符串;

public class __459重复的子字符串_枚举 {
    //给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
    /**
    方法一: 双重for循环,其中一个for循环,用i,j记录起始,截止位置;;另一个for循环,用于剩余的j到结尾。
     */
    public boolean repeatedSubstringPattern(String s) {
        /*
        提示:
            1 <= s.length <= 104
            s 由小写英文字母组成
        解法1:调用KMP算法/暴力for循环?,将一个部分,分成从[0,i]和[i+1,s.length-1]的两个子串。
         */
        int n = s.length();
        for (int i = 1;i*2 <= n;i++){   //要能够匹配,最多只能遍历一般即可。
            if (n % i == 0){    //把i作为匹配对象
                boolean match = true;
                for (int j = i;j < n;j++){     //j是匹配位置
                    if (s.charAt(j)!= s.charAt(j-i)){   //同步j-i位置。【i为配对对象】
                        match = false;
                        break;
                    }
                }
                if (match){
                    return true;
                }
            }
        }
        return false;
    }
}

__459重复的子字符串_字符串匹配

package 代码随想录.字符串;

public class __459重复的子字符串_字符串匹配 {
    /**
     * 调用方法进行配对
     *
     * @param s
     * @return
     */
    public boolean repeatedSubstringPattern(String s){
       return (s+s).indexOf(s,1) != s.length();
    }
}

__459重复的子字符串_KMP算法

package 代码随想录.字符串;

import java.util.Arrays;

public class __459重复的子字符串_KMP算法 {
    public boolean repeatedSubstringPattern(String s) {
        //确定一个固定的长度的字符串,去kmp配对另一个相同长度的字符串。
        return myKMP(s+s,s);    //这道题的原本是判别s是否是由某组字符重复构成
    }

    /**
     *
     * @param query
     * @param pattern
     * @return
     */
    private boolean myKMP(String query, String pattern) {
        int n = query.length();
        int m = pattern.length();
        int  [] fail = new int[m];
        Arrays.fill(fail,-1);
        for (int i = 1;i<m;i++){
            int j = fail[i-1];
            while (j != -1 && pattern.charAt(j+1)!= pattern.charAt(i)){
                j = fail[j];
            }
            if (pattern.charAt(j+1) == pattern.charAt(i)){
                fail[i] = j +1;
            }
        }
        int match = -1;
        for (int i = 1;i<n-1;i++){
            while (match != -1 && pattern.charAt(match + 1) != query.charAt(i)){
                match = fail[match];
            }
            if (pattern.charAt(match + 1) == query.charAt(i)){
                match++;
                if (match == m-1){
                    return true;
                }
            }
        }
        return false;
    }
}

__459重复的子字符串_优化的KMP算法

package 代码随想录.字符串;

import java.util.Arrays;

public class __459重复的子字符串_优化的KMP算法 {
    public boolean repeatedSubstringPattern(String s) {
        //确定一个固定的长度的字符串,去kmp配对另一个相同长度的字符串。
        return myKMP(s);    //这道题的原本是判别s是否是由某组字符重复构成
    }

    /**
     *
     * @param pattern
     * @return
     */
    private boolean myKMP(String pattern) {
       int n = pattern.length();
       int [] fail = new int[n];
       Arrays.fill(fail,-1);
       for (int i = 1;i<n;i++) {
           int j = fail[i-1];
           while (j!= -1 && pattern.charAt(j+1)!= pattern.charAt(i)){
               j = fail[j];
           }
           if (pattern.charAt(j+1) == pattern.charAt(i)){
               fail[i] = j +1;
           }
       }
       return fail[n-1] != -1 && n%(n- fail[n-1] - 1) == 0 ;
    }

}

错误经验吸取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/136005.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Mybatis小白从0到90%精讲】16: Mybatis like语句四种传参方式

文章目录 前言方式一:Java代码拼接方式二:MySQL CONCAT函数方式三:Mybatis bind标签方式四:SQL拼接前言 在实际开发中,SQL中使用 模糊查询like使用非常普遍,在MyBatis中,为了防止SQL注入攻击,可以使用#{}来传递参数,切记like语句不要使用${}的方式! 这里我总结了 四…

【彻底搞懂C指针 】Malloc 和 Free 的具体实现 (笔记)

【彻底搞懂C指针】Malloc 和 Free 的具体实现 https://danluu.com/malloc-tutorial/ 进程间的通信 : ①共享内存 ② 消息传递 &#xff08;内核实现&#xff09; 分配策略 (实现方面) by DUCK sbrk() malocal实现的主要函数 man sbrk 查看 数据结构 一个参考代码 https…

(离散数学)逻辑连接词

异或可以理解为不同为1相同为0 P->Q的前件和后件满足0->1的其中一个就为真 <—>可以看做 &#xff0c;相同为1不同为0 异或与等价相反

计算机课设python项目matplotlib数据可视化分析代码以及数据文档+自动化selenium实现boss网站爬虫代码

这是一个数据分析可视化课程的结课作业设计&#xff0c;受人所托写的&#xff0c;现在分享出来&#xff0c;有需要的同学自取哈&#xff0c;以下是文件目录&#xff0c;包括数据分析和爬虫代码都有&#xff0c;下载下来当一个demo也还是不错的&#xff0c;这篇博客就是文档里的…

灰度与二值化

人工智能的学习之路非常漫长&#xff0c;不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心&#xff0c;我为大家整理了一份600多G的学习资源&#xff0c;基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…

c++ 模拟进制之间的转换

c 模拟进制之间的转换 废话少说&#xff0c;直接上图 效果图 短除法 思想 过程 1 十进制 转 二进制 > 短除法 2 十进制 转 八进制 > 短除法 3 十进制 转 十六进制 > 短除法4 二进制 转 十进制 5 二进制 转 八进制 可以先将 二进制 转成 十进制&#xff0c;然…

Java继承和多态(1)

&#x1f435;本主题将分为篇文章&#xff0c;本篇文章将主要对继承进行讲解 一、介绍继承 1.1 什么是继承 假如有两个类&#xff1a;A类和B类&#xff0c;A类在保持原有成员变量和方法的基础上可以使用B类的成员变量和方法&#xff0c;此时就称A类继承了B类&#xff0c;A类为…

微信公众号历史文章采集教程思路

大家好&#xff0c;我是淘小白&#xff01; 今天来说下微信公众号历史记录文章采集的教程和思路&#xff0c;希望能够帮助的到大家~ 1、历史消息入口 现在新版本的微信已经找不到历史记录的入口了&#xff0c;需要对这个入口进行拼接&#xff0c;方法如下&#xff1a; 随便…

适用于初学者的 .NET MAUI

适用于初学者的 .NET MAUI | Microsoft Learn 记录微软Learn中用到的代码。文章比较粗糙&#xff0c;大部分是项目代码粘贴。想详细学习的可到上面的链接学习&#xff0c;代码可以从这里复制后直接运行。 练习中一共有两个页面&#xff1a; 1、MainPage.xaml 用于添加列表中的…

【Python】Matplotlib-多张图像的显示

一&#xff0c;情景描述 大家在写论文或者实验报告的时候&#xff0c;经常会放多张图片或数据图像在一起形成对比。比如&#xff0c;我现在有一张经过椒盐噪声处理的图像&#xff0c;现在进行三种滤波&#xff0c;分别是均值&#xff0c;高斯&#xff0c;中值滤波&#xff0c;…

3.HTML中语法规范

3. HTML语法规范 3.1 基本语法概述 3.1.1 HTML标签 1 HTML 标签是由尖括号包围的关键字&#xff0c;例如<html>。 2. HTML 标签通常是成对出现的&#xff0c;例如<html>和</html>,我们称为双标签。标签对中的第一个标签是开始标签&#xff0c;第二个标签是…

74hc595模块参考

74hc595模块参考 8位串行并行输出&#xff08;SIPO&#xff09;移位寄存器 使用74HC595移位寄存器扩展微控制器上的输出引脚数量。如果你需要扩充输入引脚的数量那么你需要74HC165移位寄存器。 SER&#xff08;串行输入&#xff09;引脚用于一次一位地将数据发送到移位寄存器…

Leetcode—107.二叉树的层序遍历II【中等】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—107.二叉树的层序遍历II 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullpt…

【Delphi】 各个平台使用 ntfy 效果说明

目录 一、Delphi 中使用 ntfy 库下载地址 二、各个平台使用效果说明 1. android 平台 2. ios 平台 3. windows 平台 三、总结 一、Delphi 中使用 ntfy 库下载地址 官方的文档地址&#xff1a;ntfyDelphi 接口库地址&#xff1a;GitHub - hazzelnuts/ntfy-for-delphi at …

DevChat全能型AI编程助手,助你“以一敌三卷翻好友”

DevChat全能型AI编程助手&#xff0c;助你“以一敌三卷翻好友” 什么是DevChat&#xff0c;它能帮助我们做什么&#xff1f; DevChat是OpenAI的一个产品&#xff0c;它是一个可以进行编程相关对话的AI。这意味着你可以使用它来解决一些编程上的问题或者获取关于编程的建议。 …

Radius是什么意思? 安当加密

Radius是什么意思&#xff1f; RADIUS&#xff08;Remote Authentication Dial In User Service&#xff09;是一种远程用户拨号认证系统&#xff0c;它由RFC 2865和RFC 2866定义&#xff0c;是应用最广泛的AAA&#xff08;Authentication、Authorization、Accounting&#xf…

MySQL中外键的使用及外键约束策略

一、外键约束的概念 外键约束&#xff08;FOREIGN KEY,缩写FK是数据库设计的一个概念&#xff0c;它确保在两个表之间的关系保持数据的一致性和完整性。 外键是指表中的某个字段的依赖于另一张表中某个字段的值&#xff0c;而被依赖的字段必须具有主键约束或者唯一约束&#…

[vuex] unknown mutation type: SET_SOURCE

项目中使用了vuex&#xff0c;并且以模块的形式分好之后。在调用的时候出现了以上问题 /*当我们commit的时候要注意要加上模块的名字 user是模块名称&#xff0c;SET_SOURCE是user模块中定义的方法 正确写法&#xff1a;*/ this.$store.commit("user/SET_SOURCE", th…

linux之IPC

linux之IPC 什么是IPC共享内存(shm)ftokshmgetshmatshmdtshmctl 消息队列msggetmsgrcvmsgsndmsgctl 旗语(信号量)semgetsemctlsemopsem三级标题三级标题 ipc命令守护进程查看守护进程 什么是IPC IPC: Inter(内核) Process(进程) Communicton&#xff08;通信&#xff09; 共享内…

解决wrong fs type, bad option, bad superblock on /dev/sda1问题

1 背景 某天挂载硬盘的时候&#xff0c;系统提示了如下错误&#xff1a; 在此记录排查过程以及解决方案。 2 排查过程 出现这种问题应该先尝试从日志入手&#xff0c;输入&#xff1a; sudo dmesg | tail输出如下&#xff1a; 关键信息&#xff1a; [ 164.750178] ntfs3:…