LeetCode 75: 1071. Greatest Common Divisor of Strings

김준수·2024년 2월 14일
0

LeetCode 75

목록 보기
2/63
post-custom-banner

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.

번역

두 개의 문자열 s와 t에 대해, "s 나누기 t"는 s = t + ... + t인 경우에만 성립합다(즉, s는 t 한개 또는 여러개로 구성됩니다)

두 개의 문자열 str1과 str2가 주어지면, "str1, str2 나누기 x" 가 성립하는 가장 큰 문자열 x를 return 하시오

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.

Solution

class Solution {
    public String gcdOfStrings(String str1, String str2) {
        if (!(str1 + str2).equals(str2 + str1))
            return "";
        int gcd = gcd(str1.length(), str2.length());
        return str1.substring(0, gcd);
    }

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

Comment

두 문자열 str1과 str2의 최장공통부분문자열(이하, gcdString)을 찾는 문제이다.

우선 두 문자열이 모두 gcdString으로 구성 되어있는지 확인해야한다.

이는 두 문자열을 합친 것과 앞뒤로 바꾸고 합친것이 서로 같은 걸로 확인할 수 있다.

if (!(str1 + str2).equals(str2 + str1))
	return "";

이후에 두 문자열이 gdcString으로 구성되어 있다는 것을 확인 했으니 gcdString을 찾아 return 하면된다.

이는 어떤 문자열 이건 상관없이 str1과 str2의 길이는 gcdString의 길이의 배수이기에 str1과 str2의 최대공배수(gcd)를 찾으면 gcdString의 길이를 알 수 있다.

이후 str1 또는 str2의 문자열을 첫 문자부터 최대공배수(gcd)의 길이만큼 짜르면 정답을 찾을 수 있다.

int gcd = gcd(str1.length(), str2.length());
return str1.substring(0, gcd);
post-custom-banner

0개의 댓글