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 하시오
Input: str1 = "ABCABC", str2 = "ABC"
Output: "ABC"
Input: str1 = "ABABAB", str2 = "ABAB"
Output: "AB"
Input: str1 = "LEET", str2 = "CODE"
Output: ""
1 <= str1.length, str2.length <= 1000
str1 and str2 consist of English uppercase letters.
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);
}
}
두 문자열 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);