思路:模拟
因为如果出现这么一个最长的字符串,那么肯定就存在于两个字符串之中,并且是这两个字符串的子集。所以我们就直接在这两个字符串中枚举即可。
但是,可能在枚举的时候会有个问题,就是我们如果是从中间截取一小段,然后取匹配,是不是还需要考虑这种情况啊?没必要,因为题目中说是这两个字符串都能由这个子集字符串拼接而成,如果我们从其中一个字符串的中间截取一段,拼接后的字符串不仅匹配不上原字符串,而且也匹配不了另一个字符串。我们只需要一端从头开始,另一端从尾往头的方向进行枚举即可,不需要考虑无头无尾截取中间的可能。
我们枚举的字符串一定是长度较小的那一个,这样可以保证缩小查找范围,更方便(不是说截取较大长度字符串不可以)。然后判断的时候,截取的字符串长度首先需要能够被两个字符串的长度都能整除才行,然后我们再各自拼接成和这两个字符串一样长度的新字符串,最后比较这两个字符串是不是分别和比较的字符串相同就可以了。
还有人会疑问这一点:假如str1="ABCABCABCABC",str2="ABCABC",这种情况下,我们的结果应该是ABC才对呀,为什么是ABCABC?这需要我们看清题目了,题目说,是可以拼接成这两个字符串的最长字符串,ABC这个结果固然可以,但是并不是最长的,ABCABC既满足拼接后相等,也满足拼接后长度一致,是最长的母庸质疑。这里提醒大家不要误解题意。
class Solution {
public String gcdOfStrings(String str1, String str2) {
if(str1==""||str2=="")
return "";
int len1=str1.length();
int len2=str2.length();
if(len1>len2){
String res1="";
String res2="";
for(int i=0;i<len2;i++){
String buf=str2.substring(0,len2-i);
if(len1%(len2-i)==0&&len2%(len2-i)==0){
int cnt=len1/(len2-i);
while(cnt>0){
res1+=buf;
cnt--;
}
int cnt0=len2/(len2-i);
while(cnt0>0){
res2+=buf;
cnt0--;
}
if(res1.equals(str1)&&res2.equals(str2))
return buf;
}
res1="";
res2="";
}
return "";
}
else{
String res1="";
String res2="";
for(int i=0;i<len1;i++){
String buf=str1.substring(0,len1-i);
if(len2%(len1-i)==0&&len1%(len1-i)==0){
int cnt=len2/(len1-i);
while(cnt>0){
res1+=buf;
cnt--;
}
int cnt0=len1/(len1-i);
while(cnt0>0){
res2+=buf;
cnt0--;
}
if(res1.equals(str2)&&res2.equals(str1))
return buf;
}
res1="";
res2="";
}
return "";
}
}
}