给出两个字符串,如果大字符串是小字符串的组合,则我的函数应该返回true,否则返回false。即
cat和catcatcatcat将返回true cat和catdogcatcat将返回false
我不确定为什么它不起作用或我的逻辑是否正确。
public static boolean isCat(String s, String y) {
int yl= y.length();
int counter= 0;
for (int i= 0; i < s.length(); i++ ) {
char[] ychar= y.toCharArray();
char[] subchar= s.substring(counter, counter + yl).toCharArray();
if (Arrays.equals(ychar, subchar) == true) {
counter+= yl;
return true;
}
}
return true;
}
答案 0 :(得分:6)
一种更简单的解决方法是replace()
带有空字符串的子字符串的所有实例,并检查结果字符串是否为空。
public class Test {
public static void main(String[] args) {
System.out.println(isCat("catcatcat", "cat")); // "true"
System.out.println(isCat("cacatcatt", "cat")); // "false"
}
public static boolean isCat(String full, String sub) {
return sub.isEmpty() || !full.isEmpty() && full.replace(sub, "").isEmpty();
}
}
或者,使用正则表达式检查字符串matches()是否为子字符串的倍数:
public static boolean isCat(String full, String sub) {
return full.matches("(\\Q" + sub + "\\E)+");
}
答案 1 :(得分:1)
最有效的方法是使用regionMatches
:这使您可以比较字符串区域而无需创建新字符串:
int a;
for (a = 0; a < s.length(); a += y.length()) {
if (!s.regionMatches(a, y, 0, y.length()) {
break;
}
}
return a == s.length();
regionMatches
实际上只是逐个字符地迭代;您可以编写一个循环:
int a;
outer: for (a = 0; a < s.length(); a += y.length()) {
if (a + y.length() > s.length()) break;
for (int b = 0; b < y.length(); ++b) {
if (s.charAt(a + b) != y.charAt(b)) break outer;
}
}
return a == s.length();
您可以用一个循环编写它:
int a = 0;
for (a = 0; a < s.length(); ++a) {
if (s.charAt(a) != y.charAt(a % y.length()) break;
}
// You could put a check for s.length() % y.length() first,
// since there is no point in looping if that is non-zero
return a == s.length() && (a % y.length()) == 0;