【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这个结论。

第三个要点是最大公约数的求法,一般使用碾转相除法。

posted @ 2021-02-07 17:40  tmpUser  阅读(79)  评论(0编辑  收藏  举报