【LeetCode-1071】字符串的最大公因子
问题
对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。
返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。
示例
输入:str1 = "ABABAB", str2 = "ABAB"
输出:"AB"
输入:str1 = "LEET", str2 = "CODE"
输出:""
解答
class Solution {
public:
string gcdOfStrings(string str1, string str2) {
if (str1 + str2 != str2 + str1) return "";
return str1.substr(0, gcd((int)str1.length(), (int)str2.length()));
}
int gcd(int a, int b) {
if (a < b) swap(a, b);
if (b == 0) return a;
return gcd(b, a % b);
}
};
重点思路
第一个要点是看出两个字符串换顺序相加得到的结果相同时,则必定含有最大子字符串。
- 必要性:假设str1是N个x,str2是M个x,那么str1+str2肯定是等于str2+str1的。
- 充分性:???
第二个要点是,确定存在最大子字符串时,两个字符串长度的最大公约数即最大子字符串长度,直接substr即可。这个证明的要点是最大公约数是所有公约数的整倍数,这个是性质,用质因数分解即可,也可套用gcd(a,b)=ma+nb这个结论。
第三个要点是最大公约数的求法,一般使用碾转相除法。