问题:重复从字符串t
中删除子字符串s
并打印所涉及的步骤数。
示例: t = ab
,s = aabb
。在第一步中,我们会检查t
中是否包含s
。这里,t包含在中间,即a(ab)b
。因此,我们将删除它,结果将为ab
并将计数值增加1
。我们再次检查t
中是否包含s
。现在,t
等于s
,即(ab)
。因此,我们从s
中删除它并递增计数。因此,由于t
中不再包含s
,我们会停止并打印计数值,在这种情况下为2
。
我尝试使用递归来解决这个问题
static int maxMoves(String s, String t) {
if ( null == s || "" == s || null == t || "" == t){
return 0;
}
int i = s.indexOf(t);
if(i != -1) {
return maxMoves(s.substring(0, i)+ s.substring(i+t.length(), s.length()), t) + 1;
} else {
return 0;
}
}
但我只传递了9/14个测试用例。我也试过这个,
static int maxMoves(String s, String t) {
int count = 0,i;
while(true)
{
if(s.contains(t))
{
i = s.indexOf(t);
s = s.substring(0,i) + s.substring(i + t.length());
}
else break;
++count;
}
return count;
}
但这也只通过了9/14例。
有谁可以帮我弄清楚我没有涉及哪些案件?
答案 0 :(得分:4)
只需将String::replaceFirst
与while
循环一起使用即可:
String s = "aabb";
String t = "ab";
int count = 0;
while (s.contains(t)) {
s = s.replaceFirst(Pattern.quote(t), "");
count++;
}
System.out.println(count);
答案 1 :(得分:2)
String s = "aabb";
String oldstr = s;
String x = "ab";
while(s.contains(x)){
s = s.replace(x, "");
}
System.out.println((oldstr.length()-s.length())/x.length());
答案 2 :(得分:1)
一种简单有效的方法是在StringBuilder
中逐字符累积字符串;如果在任何时候其缓冲区以您要替换的字符串结尾,请将其删除:
StringBuilder sb = new StringBuilder();
int c = 0;
for (int i = 0; i < s.length(); ++i) {
sb.append(s.charAt(i));
int last = sb.length()-t.length();
if (last >= 0 && sb.indexOf(t, last) == last) {
sb.setLength(last);
++c;
}
}
// c is now the number of times you removed t from s.