本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。
给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1 :
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。
二、思路分析
此题可利用数学的解法进行解答:
- 假设
s可由子字符串x重复n次构成,即s = nx,则s+s = 2nx。 - 移除
s+s开头和结尾的字符,变为(s+s)[1:-1],则破坏了开头和结尾的子字符串x,此时只剩2n-2个元素。 - 注意了开始进行不等式变换! 若
s在(s+s)[1:-1]中,则有2n-2 >= n,即n >= 2。 n >= 2即代表s至少可由x重复2次构成,否则,n < 2,n为整数,只能取1,说明 s 不能由其子串重复多次构成。
是不是很不可思议。
三、AC 代码
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
if s in (s+s)[1:-1]:
return True
else:
return False
输出为:
四、总结
该题是利用了数学中的不等式思想进行解答的,从此题可以看出,数学和编程密不可分,合理对代码思路进行假设,有利于代码的推导和编译。