3月打卡活动第12天 LeetCode第1071题:字符串的最大公因子(简单)

3月打卡活动第12天 LeetCode第1071题:字符串的最大公因子(简单)

  • 题目:对于字符串 S 和 T,只有在 S = T + … + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。
    在这里插入图片描述
  • 解题思路:需要注意的有两点,一是子串的长度必须是两个字符串长度的公因数,二是substring(i,i+l)方法取值范围为i到i+l-1。
class Solution {
    public String gcdOfStrings(String str1, String str2) {
        String ans = "";
        //判断两个字符串是否为空
        if(str1.isEmpty() || str2.isEmpty()) return ans;
        //如果两个字符串长度相等,必须的完全相等才有共同子串
        if(str1.length()==str2.length()){
            if(!str1.equals(str2)) return "";
        }
        //使len2为长度短的字符串
        if(str1.length()<str2.length()){
            ans = str1;
            str1 = str2;
            str2 = ans;
        }
        int len1 = str1.length();
        int len2 = str2.length();
        //l代表共同子串的长度
        int l = len2;
        while(true){
            //取长度的公因数
            while(l>1){
                if(len2%l==0 && len1%l==0) break;
                l--;
            }
            if(l==1) return "";
            //从str2中取子串
            ans = str2.substring(0,l);
            int i = 0;
            while(i+l<=len1){
                //判断ans与str1取得的子串是否相等
                if(ans.equals(str1.substring(i,i+l))){
                    i += l;
                }else{
                    ans = "";
                    break;
                }
            }
            if(i+l>=len1){
                break;
            }else{
                l--;
            }
        } 
        return ans;
    }
}

在这里插入图片描述

  • 题解做法:这个做法好酷呀,如果能判断存在公因子,问题就简化成了求最大公因数了。
class Solution {
    public String gcdOfStrings(String str1, String str2) {
        // 假设str1是N个x,str2是M个x,那么str1+str2肯定是等于str2+str1的。
        if (!(str1 + str2).equals(str2 + str1)) {
            return "";
        }
        // 辗转相除法求gcd。
        return str1.substring(0, gcd(str1.length(), str2.length()));
    }

    private int gcd(int a, int b) {
        return b == 0? a: gcd(b, a % b);
    }
}

作者:sweetiee
链接:https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/java-hen-jian-ji-yi-yan-jiu-neng-kan-ming-bai-by-s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值