今天刷力扣发现一道有趣的题,这道题目很普通,但是解法确可以偷懒

原题链接:力扣459:重复的子字符串

题目

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

  • 1 <= s.length <= 104
  • s 由小写英文字母组成
Related Topics
  • 字符串
  • 字符串匹配

  • 个人解法

    想法:既然要判断字符串是否由一个子串重复多次构成,那么如果结果是肯定的,这个字符串的长
    度一定能够整除子串的长度。

    所以我首先做一个循环,找到可能作为子串重复的字符串,在其基础上判断是否满足,循环结束
    后都没有找到满足的,那么结果肯定就是false了。

    接下来我们考虑循环内部的逻辑,如果一个子串可以满足子串重复多次组成当前的字符串,那么按
    照子串的长度分割,每一部分都是相同的。接下来就是重点了!!!重点!!!怎么判断这些部分
    都相同??

    假设满足条件:
            s = "abdfs"
            parent = s1+s2+s3+s4+....sn(s1...sn都是s)
    根据上面的字符串以及子串作说明
    可以分为两步判断:
    1. s1和sn相同
    2. s2s3s4...sn和s1s2s3....s(n-1)相同
    2中s2=s1,s3=s2.....sn=s(n-1),这样一来s1,s2,s3....sn就都相同了

    {% tabs categories%}

    class Solution {
        public boolean repeatedSubstringPattern(String s) {
            int lens = s.length();
            for (int i = 1; i < lens; i++) {
                if (lens % i == 0) {
                    if (s.substring(0, i).equals(s.substring(lens - i))
                            && s.substring(i).equals(s.substring(0, lens - i))) {
                        return true;
                    }
                }
            }
            return false;
        }
    }
    
    class Solution:
        def repeatedSubstringPattern(self, s: str) -> bool:
            for i in range(1, len(s)):
                if len(s) % i == 0:
                    if s[0:i] == s[len(s)-i:len(s)] and s[0:len(s)-i] == s[i:len(s)]:
                        return True
            return False
    

    {% endtabs %}