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;