leetCode 75:1071-字符串的最大公因子

方法二:枚举优化

目的:找出一个最长的子串x,使得x经过若干次拼接能够得到str1和str2

  • 很容易想到从头枚举字串x,枚举一次判断一次x是否满足要求。
  • 由整除特性,可以进一步联想到,首先得到str1和str2长度的最大公因数,再获得最大公因数对应位置的子串xx,再判断xx是否满足要求,满足则返回,不满足则继续枚举。

 证明:如果最大公因数位置对应的子串满足要求,则该字串为答案,否则,一定不存在更短的子串满足要求,答案为空

  1. 首先假设:最大公因数位置对应的子串xx不满足要求,但存在某更短的子串subx满足要求(即不能通过若干次拼接得到str1和str2)。
  2. 在1的假设下,若存在某更短的子串subx,那么:subx可以经过若干次拼接得到str1和str2;subx的长度是xx长度的因子,subx也可以经过若干次拼接得到xx;xx的长度是str1和str2的因子,xx也能经过若干次拼接得到str1和str1。
  3. 这与假设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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值