反复从字符串中删除子串
问题:重复从字符串s
中删除子串t
,并打印执行相同操作的步骤数。反复从字符串中删除子串
实施例:t = ab
,s = aabb
。在第一步中,我们检查t
是否包含在s
之内。这里,t包含在中间,即a(ab)b
。因此,我们将删除它,结果将为ab
并将计数值增加1
。我们再次检查s
是否包含t
。现在,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例。
任何人都可以帮我找出哪些情况下我不覆盖?
只要您可以使用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);
不幸的是,我最终只通过了3/14测试用例。 –
@AbdullahKhan尝试使用'replaceFirst'而不是'replace' –
如果't'包含特殊的正则表达式字符怎么办? –
一个简单而有效的方式是累积串字符一个字符在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.
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());
如果我要将替换放入循环中,因为我试图返回字符串被替换次数的计数,那么我会将Sysout中的内容放入while循环吗? ((oldstr.length() - s.length())/ x.length())!= 0){count ++; }或者是完全离开基地。 –
@AbdullahKhan我真的不知道你想说什么。只需将'(oldstr.length() - s.length())/ x.length()'放在一个变量中。这是最后的计数。 –
哦,你说得对,我误解了你的意思。您的解决方案只能通过3/14测试用例不幸 –
[字符串替换#(https://docs.oracle:如果在它的缓冲区要替换字符串结尾的任何时候,将其删除。 com/javase/7/docs/api/java/lang/String.html#replace(java.lang.CharSequence,%20java.lang.CharSequence)) –
'“”== s' - > [如何比较字符串在Java?](https://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java),或在这种情况下's.isEmpty()'更清晰。 – Pshemo
是的,我改变了它,但仍然只有9/14例正在通过。我不认为空串被检查。 –