方法二:枚举优化
目的:找出一个最长的子串x,使得x经过若干次拼接能够得到str1和str2
- 很容易想到从头枚举字串x,枚举一次判断一次x是否满足要求。
- 由整除特性,可以进一步联想到,首先得到str1和str2长度的最大公因数,再获得最大公因数对应位置的子串xx,再判断xx是否满足要求,满足则返回,不满足则继续枚举。
证明:如果最大公因数位置对应的子串满足要求,则该字串为答案,否则,一定不存在更短的子串满足要求,答案为空
- 首先假设:最大公因数位置对应的子串xx不满足要求,但存在某更短的子串subx满足要求(即不能通过若干次拼接得到str1和str2)。
- 在1的假设下,若存在某更短的子串subx,那么:subx可以经过若干次拼接得到str1和str2;subx的长度是xx长度的因子,subx也可以经过若干次拼接得到xx;xx的长度是str1和str2的因子,xx也能经过若干次拼接得到str1和str1。
- 这与假设1矛盾。因此,如果存在subx满足要求,最大公因数位置对应的xx就一定满足要求。如果最大公因数位置对应的xx不满足要求,那么不存在任何一个子串满足要求。这就是官方给出的方法二代码的含义。
class Solution {
public:
string gcdOfStrings(string str1, string str2) {
int len1 = str1.size();
int len2 = str2.size();
string T = str1.substr(0, __gcd(len1, len2));
if(check(T, str1) && check(T, str2))return T;
else return "";
}
private:
bool check(string T, string s){
int len = s.size() / T.size();
string temp;
for(int i = 1; i <= len; ++i){
temp += T;
}
return temp == s;
}
};