0%

459. 重复的子字符串

459. 重复的子字符串

移动匹配

当一个字符串s:abcabc,内部由重复的子串组成,那么这个字符串的结构一定是这样的:

移动匹配

也就是由前后相同的子串组成。

那么既然前面有相同的子串,后面有相同的子串,用 s + s,这样组成的字符串中,后面的子串做前串,前后的子串做后串,就一定还能组成一个s,如图:

移动匹配2

所以判断字符串s是否由重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。

当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,要刨除 s + s 的首字符和尾字符,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
class Solution{
public:
bool repeatedSubstringPattern(string s){
string t=s+s;
t.erase(t.begin());
t.erase(t.end()-1);//掐头去尾
if(t.find(s)!=std::string::npos)//比如在 find() 函数中查找一个子串未找到时,会返回 std::string::npos
return true;
return false;
}
};
比如在 find() 函数中查找一个子串未找到时,会返回 std::string::npos
-------------本文结束感谢您的阅读-------------
老板你好,讨口饭吃