3月打卡活动第12天 LeetCode第1071题:字符串的最大公因子(简单)
- 题目:对于字符串 S 和 T,只有在 S = T + … + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。
- 解题思路:需要注意的有两点,一是子串的长度必须是两个字符串长度的公因数,二是substring(i,i+l)方法取值范围为i到i+l-1。
class Solution {
public String gcdOfStrings(String str1, String str2) {
String ans = "";
if(str1.isEmpty() || str2.isEmpty()) return ans;
if(str1.length()==str2.length()){
if(!str1.equals(str2)) return "";
}
if(str1.length()<str2.length()){
ans = str1;
str1 = str2;
str2 = ans;
}
int len1 = str1.length();
int len2 = str2.length();
int l = len2;
while(true){
while(l>1){
if(len2%l==0 && len1%l==0) break;
l--;
}
if(l==1) return "";
ans = str2.substring(0,l);
int i = 0;
while(i+l<=len1){
if(ans.equals(str1.substring(i,i+l))){
i += l;
}else{
ans = "";
break;
}
}
if(i+l>=len1){
break;
}else{
l--;
}
}
return ans;
}
}
- 题解做法:这个做法好酷呀,如果能判断存在公因子,问题就简化成了求最大公因数了。
class Solution {
public String gcdOfStrings(String str1, String str2) {
if (!(str1 + str2).equals(str2 + str1)) {
return "";
}
return str1.substring(0, gcd(str1.length(), str2.length()));
}
private int gcd(int a, int b) {
return b == 0? a: gcd(b, a % b);
}
}
作者:sweetiee
链接:https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/java-hen-jian-ji-yi-yan-jiu-neng-kan-ming-bai-by-s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。