字符串的最大公因子(数组 / 字符串)

47 阅读2分钟

image.png

class Solution {
    public String gcdOfStrings(String str1, String str2) {
        int len1 = str1.length(), len2 = str2.length();
        for (int i = Math.min(len1,len2); i >= 1; i--) {
            if (len1 % i == 0 && len2 % i == 0){
                String x = str1.substring(0,i);
                if (check(x,str1) && check(x,str2)){
                    return x;
                }
            }
        }
        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);
    }
}

利用枚举法来判断:设前缀串的长度为lenx,则lenx必须为两个字符串长度的约数才能满足条件,否则无法经过若干次拼接后得到长度相等的字符串。

此题使用了StringBuffer,它和StringBuilder的区别如下:

StringBuffer 和 StringBuilder 都是 Java 中的字符串处理类,它们都继承自 AbstractStringBuilder 类。这两个类都可以用来构建字符串,但它们之间有一些重要的区别。

StringBuffer 是线程安全的,也就是说,多个线程可以安全地同时访问一个 StringBuffer 对象。因此,如果你需要在多线程环境中构建字符串,那么使用 StringBuffer 是更好的选择。但是由于线程安全会带来一定的性能开销,所以 StringBuffer 的效率比 StringBuilder low。

StringBuilder 是线程不安全的,也就是说,如果多个线程同时访问一个 StringBuilder 对象,可能会发生不可预期的结果。因此,如果不需要考虑多线程问题,那么使用 StringBuilder 效率更高。

总而言之,如果你需要在多线程环境中构建字符串,使用 StringBuffer ,否则使用 StringBuilder 。

辗转相除法:即m 和 n求最大公因数(假设m大于n),先用 m 除以 n ,如果余数 r 为 0 ,则 n 就是最大公因数,否则,将 n 给了 m ,将 r 给了 n ,再用 m 除以 n ,如果余数 r 为 0 ,则n为最大公因数,否则重复执行上述操作,直至 r 为 0 ,此时的 n 就是 m 和 n 的最大公因数。

subString:

1、String a = “123456anbdc”;
String b = a.subString(1);
此时得到的为字符串a从下标为1的位置开始截取到最后的值,也就是23456anbdc;

2、String a = “123456anbdc”;
String b = a.subString(1,5);
此时得到的为字符串a从下标为1的位置开始截取到下标为5的位置的值(不包括下标为5的值),也就是2345;