Description#
Given a string s
, check if it can be constructed by taking a substring of it and appending multiple copies of the substring together.
Example 1:
Input: s = "abab"
Output: true
Explanation: It is the substring "ab" twice.
Example 2:
Input: s = "aba"
Output: false
Example 3:
Input: s = "abcabcabcabc"
Output: true
Explanation: It is the substring "abc" four times or the substring "abcabc" twice.
Constraints:
1 <= s.length <= 104
s
consists of lowercase English letters.
Solutions#
Solution 1#
1
2
3
| class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
return (s + s).index(s, 1) < len(s)
|
1
2
3
4
5
6
| class Solution {
public boolean repeatedSubstringPattern(String s) {
String str = s + s;
return str.substring(1, str.length() - 1).contains(s);
}
}
|
1
2
3
4
5
6
| class Solution {
public:
bool repeatedSubstringPattern(string s) {
return (s + s).find(s, 1) < s.size();
}
};
|
1
2
3
| func repeatedSubstringPattern(s string) bool {
return strings.Index(s[1:]+s, s) < len(s)-1
}
|
1
2
3
| function repeatedSubstringPattern(s: string): boolean {
return (s + s).slice(1, (s.length << 1) - 1).includes(s);
}
|
1
2
3
4
5
| impl Solution {
pub fn repeated_substring_pattern(s: String) -> bool {
(s.clone() + &s)[1..s.len() * 2 - 1].contains(&s)
}
}
|
Solution 2#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| function repeatedSubstringPattern(s: string): boolean {
const n = s.length;
for (let i = 0; i < n >> 1; i++) {
const len = i + 1;
if (n % len !== 0) {
continue;
}
const t = s.slice(0, len);
let j: number;
for (j = len; j < n; j += len) {
if (s.slice(j, j + len) !== t) {
break;
}
}
if (j === n) {
return true;
}
}
return false;
}
|