重复的子字符串(题目来自LeetCode)

字符串——重复子字符串 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。提示:s 由小写英文字母组成。 阅读详情
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:

输入: “abab”

输出: True

解释: 可由子字符串 “ab” 重复两次构成。 示例 2:

输入: “aba”

输出: False 示例 3:

输入: “abcabcabcabc”

输出: True

解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。)

思路一:

找出字符串s所有可能的子字符串,子字符串的长度应为字符串s的因子。
判断s是否可由改子字符串构成。

代码如下:

 public boolean repeatedSubstringPattern(String s) {
        int length = s.length();
        for (int i = 0; i <length/2 ; i++) {
            int i1 = length % (i + 1);
            if (i1==0){
               if (isRepeated(s,s.substring(0,i+1))){
                   return true;
               };
            }
        }
        return false;
    }
    public Boolean isRepeated(String s1,String s2){
        Boolean result = true;
        for (int i = 0; i <s1.length()/s2.length() ; i++) {
            String substring = s1.substring(i * s2.length(), (i + 1) * s2.length());
            if (!s2.equals(substring)) {
                return false;
            }
        }
        return result;
    }

思路二:kmp算法

代码如下:

    public boolean repeatedSubstringPattern(String s) {
        return kmp(s + s, s);
    }

    public boolean kmp(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;
    }
字符串7:重复子字符串 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 阅读详情

相关推荐

四、字符串(7):重复子字符串

力扣题目链接(opens new window) 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 示例 1: 输入: "abab" 输出: True 解释: 可由子字符串 "ab" 重复两次构成。 示例 2: 输入: "aba" 输出: False 示例 3: 输入: "abcabcabcabc" 输出: True 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。) .

努力努力努力 1656

字符串——3.重复子字符串

首先,我们来分析一下这个自定义函数getNext,在分析之前,我先简单讲一下这个解法的原理,如果字符串s是由它的子串重复构成的,那么一定存在两种特征,一是最小子串的长度是能被原始子串s长度整除的(这个很容易理解,最小子串长度如果是3的话,那你重复构成的s长度肯定是3的倍数吧);那么题目就转化为了在s+s中寻找有没有s,利用python中的find函数就可以完成了,但是在s+s中寻找s总感觉奇奇怪怪的,既然是s+s那其中不本来就有s么,怎么判断是原始的s还是新组成的字符串中的s呢?首先判断nxt[-1]!

plutomty的博客 2894

字符串7——重复子字符串

重复的字符串

wtlll的博客 2860

LeetCode题目笔记——459. 重复子字符串,python从700ms到60ms

LeetCode 459.重复子字符串,O(N)解决,常规方法,简单易懂。

一个苦逼研究僧的博客 1149

【力扣1876】长度为三且各字符不同的子字符串

长度为三且各字符不同的子字符串

子夜的个人博客 395

力扣(LeetCode)刷题,简单题(第23期)

目录 第1题:整数转换 第2题:重复子字符串 第3题:范围求和2 第4题:反转数位 第5题:数字转换为十六进制 第6题:比较含退格的字符 第7题:三个数的最大乘积 第8题:珠玑妙算 第9题:旋转字符串 第10题:较大分组的位置 力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。 第1题:整数转换 试...

108

字符串——7.力扣题目:459. 重复子字符串

kmp算法查找重复子串

big_face_kitty的博客 172

LeetCode 459. 重复子字符串(Repeated Substring Pattern)

459. 重复子字符串 459. Repeated Substring Pattern 题目描述 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过 10000。 LeetCode459. Repeated Substring Pattern 示例 1: 输入: "abab" 输出: True 解释: 可由子字符串 "ab" 重复两次构...

weixin_30590285的博客 139

代码随想录训练营第9天|28. 实现 strStr()、459.重复子字符串

对于KMP算法,还需要加深理解。

m0_63071531的博客 62

Leetcode 459. 重复子字符串 C++

Leetcode 459. 重复子字符串 题目 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 测试样例 示例 1: 输入: "abab" 输出: True 解释: 可由子字符串 "ab" 重复两次构成。 示例 2: 输入: "aba" 输出: False 示例 3: 输入: "abcabcabcabc" 输出: True 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构

weixin_43750513的博客 373

C/C++描述 LeetCode 459. 重复子字符串 一行秒解。

C/C++描述 LeetCode 459. 重复子字符串   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一博客更新的地址为:亓官劼的博客 本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!! 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 示例 1: 输入: "abab" 输出: True 解释: 可由

渡过寒冬 2854

【剑指Offer】48. 最长不含重复字符的子字符串

力扣 题目描述 输入一个字符串(只包含 a~z 的字符),求其最长不含重复字符的子字符串的长度。例如对于 arabcacfr,最长不含重复字符的子字符串为 acfr,长度为 4。 解题思路 class Solution { public int lengthOfLongestSubstring(String s) { int res = 0, left = 0; HashMap<Character, Integer> hash = new HashMap&

瑞新の博客:bennyrhys 1144

LeetCode--最长不含重复字符的子字符串

LeetCode--最长不含重复字符的子字符串 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 leetcode题,面试48 最长不含重复字符的子字符串 题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解...

归子莫的博客 1385

求最长不含重复字符的子字符串——C++

拿到题目第一想法是滑动窗口,用左left右right指针只差表示不重复子字符串长度,然后右指针依次右移动,假如入到重复字符,则更新左指针到不重复的字符串位置。比如abba,此时ab为不重复,当右指针移到abb时有重复字符,此时需要更新左指针到不重复的字符位置,也即abb的最后一个b的位置,此时左右指针指向同一个值。如何更新左指针到最近重复字符位置呢,此时需要用一个哈希表记录每个字符和对应字符的下标,并且遇到重复字符则更新为最近位置。关键代码如下:

净无邪博客 3102

LeetCode 459 重复子字符串 Python

LeetCode 459 重复子字符串 Python 题目描述: 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 示例 1: 输入: "abab" 输出: True 解释: 可由子字符串 "ab" 重复两次构成。 示例 2: 输入: "aba" 输出: False 示例 3: 输入: "a...

Tianchi_M的博客 1082

LeetCode题目详解】通过讲解28. 找出字符串中第一个匹配项的下标459. 重复子字符串 详细说明了kmp算法(day9补)

详细讲解了kmp算法

weixin_67972246的博客 1406

Leetcode 459.重复子字符串(Repeated Substring Pattern)

Leetcode 459.重复子字符串 1 题目描述(Leetcode题目链接)   给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 输入: "abab" 输出: True 解释: 可由子字符串 "ab" 重复两次构成。 输入: "aba" 输出: False 输入: "abcabcabcabc" 输出: True 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

qq_39378221的博客 227

LeetCode第 459 题:重复子字符串(C++)

459. 重复子字符串 - 力扣(LeetCode) 双倍字符串的思路:图解一下双倍字符串的解法 - 重复子字符串 - 力扣(LeetCode) class Solution { public: bool repeatedSubstringPattern(string s) { return (s+s).find(s, 1) != s.size(); } }; 暴力法: class Solution { public: bool repeatedSubstrin

zj 638
上一篇: 重构二行二进制矩阵(题目来自LeetCode)
下一篇: 三维形体的表面积(题目来自LeetCode)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值