Leetcode459-重复的子字符串|刷题打卡

120 阅读1分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述

给定一个非空字符串,判断它是否可以由它的一个子串重复多次构成

给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1 :

输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。

二、思路分析

此题可利用数学的解法进行解答

  1. 假设 s 可由子字符串 x 重复 n 次构成,即 s = nx,则 s+s = 2nx
  2. 移除 s+s 开头和结尾的字符,变为 (s+s)[1:-1],则破坏了开头和结尾的子字符串 x,此时只剩 2n-2 个元素。
  3. 注意了开始进行不等式变换!s (s+s)[1:-1] 中,则有 2n-2 >= n,即 n >= 2
  4. n >= 2即代表 s 至少可由 x 重复 2 次构成,否则,n < 2n 为整数,只能取 1说明 s 不能由其子串重复多次构成

是不是很不可思议。

三、AC 代码

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        if s in (s+s)[1:-1]:
            return True
        else:
            return False

输出为:

image.png

四、总结

该题是利用了数学中的不等式思想进行解答的,从此题可以看出,数学和编程密不可分,合理对代码思路进行假设,有利于代码的推导和编译。