LeetCode | 1071. Greatest Common Divisor of Strings

 

题目:

For strings S and T, we say "T divides S" if and only if S = T + ... + T  (T concatenated with itself 1 or more times)

Return the largest string X such that X divides str1 and X divides str2.

 

Example 1:

Input: str1 = "ABCABC", str2 = "ABC"
Output: "ABC"

Example 2:

Input: str1 = "ABABAB", str2 = "ABAB"
Output: "AB"

Example 3:

Input: str1 = "LEET", str2 = "CODE"
Output: ""

 

Note:

  1. 1 <= str1.length <= 1000
  2. 1 <= str2.length <= 1000
  3. str1[i] and str2[i] are English uppercase letters.

 

解题思路:

输入为str1和str2,定义:对于字符串T来说,若可以分解为字符串X的级联形式,如X X X ...,则称X为T的divisor分解串。输出时找到str1和str2的最大divisor并输出,若str1和str2不包含divisor则输出空字符串“”。

假设str2为较短的字串,先对它寻找divisor,然后将divisor与str1进行判断,如果不符合divisor条件则继续寻找,符合则返回输出。

 

代码:

class Solution {
public:
    bool checkDivisor(string& T, string& X) {
        if(T.length() % X.length())
            return false;
        int times = T.length() / X.length();
        for(int i = 0; i<times; i++)
        {
            string subT = T.substr(i*X.length(), X.length());
            if(subT != X)
                return false;
        }
        return true;
    }
    string gcdOfStrings(string str1, string str2) {
        if(str1.length() < 1 || str2.length() < 1)
            return "";
        if(str1.length() < str2.length())
        {
            swap(str1, str2);
        }
        
        string X = "";
        for(int i = 1; i <= str2.length(); i++)
        {
            if(str2.length() % i)
                continue;
            string x = str2.substr(0, str2.length() / i);
            
            if(!checkDivisor(str2, x))
                continue;
            if(checkDivisor(str1, x))
            {
                X = x;
                break;
            }
        }
        return X;
    }
};

 

忘记string可以直接比较= =,也不太熟悉string的取子串substr接口,所以debug了一段时间。Anyway,最终还是AC啦~

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值