049--力扣刷题459--重复的子字符串-pin2字符串构造
2字符串构造
有一个长度为n的字符串P,我们可以通过P构造出一个无限长度的字符串S,其中S[i]=P[i%n]。给定一个字符串S,求可以通过上述方法构造出S的最短字符串P。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import sys #s =sys.stdin.readline().strip() s='abcdabcabc' n=len(s) for i in range(1,n//2): p=''.join(s[0:i]) q='' for j in range(n): q=q+p[j%(len(p))] if q == s: print(p) break if i == (n//2)-1: #查找到了中间也不能满足的话说明只有原来的串才是可以的 print(s) |
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。 示例 2:
输入: "aba"
输出: False 示例 3:
输入: "abcabcabcabc"
输出: True
解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
1 2 3 4 5 6 7 8 9 10 | class Solution(object): def repeatedSubstringPattern(self, s): """ :type s: str :rtype: bool """ for l in range(1,len(s)//2+1): if s[:l] * (len(s)//l) == s: return True return False |
看了评论区python一行代码高赞解答,理解了一下,给大家参考。
- 一个字符串如果符合要求,则该字符串至少由2个子串组成。例:b b / abc abc
s+s。以后,则该字符串至少由4个子串组成 bb+bb / abcabc+abcabc
-
截去首尾各一个字符s[1:-1] (注:只截一个是为了判断类似本例,重复子串长度为1的情况。当重复子串长度大于1时,任意截去首尾小于等于重复子字符串长度都可)
-
由于s+s组成的4个重复子串被破坏了首尾2个,则只剩下中间两个 b bb b。此时在判断中间两个子串组成是否等于s,若是,则成立。
1 2 3 | class Solution: def repeatedSubstringPattern(self, s: str) -> bool: return (s + s)[1: -1].find(s) != -1 |