Skip to content

Latest commit

 

History

History

1071

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 

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

Given two strings str1 and str2, return the largest string x such that x divides both str1 and 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: ""

Example 4:

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

 

Constraints:

  • 1 <= str1.length <= 1000
  • 1 <= str2.length <= 1000
  • str1 and str2 consist of English uppercase letters.

Related Topics:
String

Solution 1. Brute Force

// OJ: https://leetcode.com/problems/greatest-common-divisor-of-strings/
// Author: github.com/lzl124631x
// Time: O(S^2)
// Space: O(S)
class Solution {
private:
    bool divisible(string a, string b) {
        int i = 0, j = 0, M = a.size(), N = b.size();
        for (; i < M; ++i) {
            if (a[i] != b[j]) return false;
            if (++j == N) j = 0;
        }
        return true;
    }
public:
    string gcdOfStrings(string str1, string str2) {
        string d = str1.size() < str2.size() ? str1 : str2;
        for (; d.size(); d.pop_back()) {
            if (str1.size() % d.size() || str2.size() % d.size()) continue;
            if (divisible(str1, d) && divisible(str2, d)) return d;
        }
        return d;
    }
};

Solution 2. GCD

// OJ: https://leetcode.com/problems/greatest-common-divisor-of-strings/
// Author: github.com/lzl124631x
// Time: O(SH) where S is string length and H is depth of recursion
// Space: O(SH)
class Solution {
public:
    string gcdOfStrings(string str1, string str2) {
        if (str1.size() < str2.size()) return gcdOfStrings(str2, str1);
        if (str2.empty()) return str1;
        auto d = str1.substr(0, str2.size());
        return d == str2 ? gcdOfStrings(str1.substr(str2.size()), str2) : "";
    }
};