Welcome to Subscribe On Youtube

1071. Greatest Common Divisor of Strings

Description

For two strings s and t, we say "t divides s" if and only if s = t + ... + t (i.e., t is concatenated with itself one 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: ""

 

Constraints:

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

Solutions

Solution 1: Direct Implementation

This implementation follows the required operations directly. It traverses the relevant values and updates its state as each value is processed. After all required states have been considered, the maintained result is returned.

Solution 2

This implementation follows the required operations directly. After all required states have been considered, the maintained result is returned.

  • class Solution {
        public String gcdOfStrings(String str1, String str2) {
            if (!(str1 + str2).equals(str2 + str1)) {
                return "";
            }
            int len = gcd(str1.length(), str2.length());
            return str1.substring(0, len);
        }
    
        private int gcd(int a, int b) {
            return b == 0 ? a : gcd(b, a % b);
        }
    }
    
  • class Solution {
    public:
        string gcdOfStrings(string str1, string str2) {
            if (str1 + str2 != str2 + str1) return "";
            int n = __gcd(str1.size(), str2.size());
            return str1.substr(0, n);
        }
    };
    
  • class Solution:
        def gcdOfStrings(self, str1: str, str2: str) -> str:
            def check(a, b):
                c = ""
                while len(c) < len(b):
                    c += a
                return c == b
    
            for i in range(min(len(str1), len(str2)), 0, -1):
                t = str1[:i]
                if check(t, str1) and check(t, str2):
                    return t
            return ''
    
    
    # Solution 2
    class Solution:
        def gcdOfStrings(self, str1: str, str2: str) -> str:
            if str1 + str2 != str2 + str1:
                return ''
            n = gcd(len(str1), len(str2))
            return str1[:n]
    
    
  • func gcdOfStrings(str1 string, str2 string) string {
    	if str1+str2 != str2+str1 {
    		return ""
    	}
    	n := gcd(len(str1), len(str2))
    	return str1[:n]
    }
    
    func gcd(a, b int) int {
    	if b == 0 {
    		return a
    	}
    	return gcd(b, a%b)
    }
    
  • impl Solution {
        pub fn gcd_of_strings(str1: String, str2: String) -> String {
            if str1.clone() + &str2 != str2.clone() + &str1 {
                return String::from("");
            }
            fn gcd(a: usize, b: usize) -> usize {
                if b == 0 {
                    return a;
                }
                gcd(b, a % b)
            }
    
            let (m, n) = (str1.len().max(str2.len()), str1.len().min(str2.len()));
            str1[..gcd(m, n)].to_string()
        }
    }
    
    

All Problems

All Solutions