题目:对于字符串 s 和 t,只有在 s = t + t + t + ... + t + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。
给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 x 能除尽 str2 。
解题思路:设前缀串长度为lenx,str1的长度为len1,str2的长度为len2,我们知道前缀串的长度必然要是两个字符串长度的约数才能满足条件,否则无法经过若干次拼接后得到长度相等的字符串,公式化来说,即
len1 mod lenx==0
len2 mod lenx==0
所以我们可以枚举符合长度条件的前缀串,再去判断这个前缀串拼接若干次以后是否等于str1 和 str2即可。
由于题目要求最长的符合要求的字符串 X,所以可以按长度从大到小枚举前缀串,这样碰到第一个满足条件的前缀串返回即可。
class Solution { public String gcdOfStrings(String str1, String str2) { int len1 = str1.length(), len2 = str2.length(); String T = str1.substring(0, gcd(len1, len2)); if (check(T, str1) && check(T, str2)) { return T; } return ""; } public boolean check(String t, String s) { int lenx = s.length() / t.length(); StringBuffer ans = new StringBuffer(); for (int i = 1; i <= lenx; ++i) { ans.append(t); } return ans.toString().equals(s); } public int gcd(int a, int b) { int remainder = a % b; while (remainder != 0) { a = b; b = remainder; remainder = a % b; } return b; } }