题目来源:
leetcode题目,网址:1071. 字符串的最大公因子 - 力扣(LeetCode)
解题思路:
求出两字符串的最小循环单元,判断是否相等。若相等,将最小循环单元重复 x 次使得其长度为 两字符串长度的最小公倍数,若不相等,返回 ""。
解题代码:
class Solution {
public String gcdOfStrings(String str1, String str2) {
String newStr1=deduplicate(str1);
String newStr2=deduplicate(str2);
String min=newStr1.equals(newStr2)?newStr1:"";
if(min.equals("")){
return min;
}
int gcd=forGCD(str1.length(),str2.length());
String res="";
for(int i=0;i<gcd/min.length();i++){
res+=min;
}
return res;
}
public int forGCD(int x,int y){
return x==0?y:forGCD(y%x,x);
}
public String deduplicate(String str){
StringBuffer res=new StringBuffer(str);
for(int i=1;i<=str.length()/2;i++){
if(res.length()%i!=0){
continue;
}
StringBuffer temp=new StringBuffer(str.substring(0,i));
StringBuffer addAll=new StringBuffer();
for(int j=0;j<res.length()/i;j++){
addAll.append(temp);
}
if(addAll.toString().equals(str)){
res=temp;
break;
}
}
return res.toString();
}
}
总结:
刚开始求的是满足要求的最短字符串,后面发现不对,改了。
官方题解给出了三种解法。第一种枚举所有可能前缀,返回最长的。第二种,判断两字符串的最大公约数前缀是否符合要求。第三种,通过 比较 str1+str2 与 str2+str1 是否相等判断是否存在,若存在,返回最大公约数前缀,否则,返回 ""。