Keshawn_lu's Blog

Leetcode 459. 重复的子字符串

字数统计: 347阅读时长: 1 min
2020/08/24 Share

题目简介:

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:

1
2
3
4
5
输入: "abab"

输出: True

解释: 可由子字符串 "ab" 重复两次构成。

示例 2:

1
2
3
输入: "aba"

输出: False

示例 3:

1
2
3
4
5
输入: "abcabcabcabc"

输出: True

解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

思路:

若字符串可以由子串重复构成,那我们可以去找每次与s[0]相同的字符的位置pos,(s[0 ... pos - 1]为待验证的子串)。

若所有出现重复字符位置的pos所构成的子串都无法满足要求(即与后面的子串不相等),即返回false

否则,返回true

tip:

  • 这题还可以用KMP算法做,先mark一下。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public:

bool judge(string& s, int pos){

if(pos == -1)
return false;

string sub_str = s.substr(0, pos + 1);

for(int i = pos + 1; i < s.size(); i += (pos + 1)){

if(s.substr(i, pos + 1) != sub_str)
return false;
}

return true;
}

bool repeatedSubstringPattern(string s) {

int first = s[0];
int pos = -1;

for(int i = 1; i < s.size(); i++){

if(s[i] == s[0]){

pos = i - 1;

if(judge(s, pos))
return true;
}
}

return false;
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: