leetcode 1071.字符串的最大公因子

思路:模拟

因为如果出现这么一个最长的字符串,那么肯定就存在于两个字符串之中,并且是这两个字符串的子集。所以我们就直接在这两个字符串中枚举即可。

但是,可能在枚举的时候会有个问题,就是我们如果是从中间截取一小段,然后取匹配,是不是还需要考虑这种情况啊?没必要,因为题目中说是这两个字符串都能由这个子集字符串拼接而成,如果我们从其中一个字符串的中间截取一段,拼接后的字符串不仅匹配不上原字符串,而且也匹配不了另一个字符串。我们只需要一端从头开始,另一端从尾往头的方向进行枚举即可,不需要考虑无头无尾截取中间的可能。

我们枚举的字符串一定是长度较小的那一个,这样可以保证缩小查找范围,更方便(不是说截取较大长度字符串不可以)。然后判断的时候,截取的字符串长度首先需要能够被两个字符串的长度都能整除才行,然后我们再各自拼接成和这两个字符串一样长度的新字符串,最后比较这两个字符串是不是分别和比较的字符串相同就可以了。

还有人会疑问这一点:假如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;i0){
                    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;i0){
                    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 "";
        }
    }
}

你可能感兴趣的:(leetcode,算法,职场和发展)