我的业务逻辑很奇怪,但总之,我会在这里解释一下。 我必须删除子字符串的第一个或最后一个出现,然后重复该过程。我认为下面的代码到目前为止工作正常。现在我想知道如何优化它,因为它对大输入(字符串长度为10000)的数据表现不佳。
int count =0;
while(s.contains(substr))
{
s= s.replaceFirst(substr,"");
// doSomeBusinessLogic(s);
count++;
}
return count;
示例
test 1 s = abababab substr = ab count = 4 test 2 s = aeerrb substr = er count =2 because after removing first er, the string becomes aerb, so remove the er again. so count is 2.
编辑 - 根据答案,看起来匹配器更好用,但是,它没有产生例外答案。
public class Solution {
static int maxMoves(String s, String substr) {
int count = 0;
StringBuffer buf = new StringBuffer();
Matcher m = Pattern.compile(substr).matcher(s);
while (m.find()) {
m.appendReplacement(buf, "");
count++;
}
m.appendTail(buf);
// System.out.println(buf.toString());
return count;
}
public static void main(String[] args) {
System.out.println("Max Moves"+ Solution.maxMoves("aeerrb","er"));
}
}
答案 0 :(得分:1)
免责声明:此答案中的代码不会处理稍后添加到问题中的示例中给出的测试2.
使用您的代码插入print语句,您将得到:
String s = "This is a test";
String substr = " ";
int count = 0;
while (s.contains(substr)) {
s = s.replaceFirst(substr, "");
System.out.println("doSomeBusinessLogic(\"" + s + "\")");
count++;
}
System.out.println("count = " + count);
输出
doSomeBusinessLogic("Thisis a test")
doSomeBusinessLogic("Thisisa test")
doSomeBusinessLogic("Thisisatest")
count = 3
首先,replaceFirst()
的参数是正则表达式,因此您需要转义参数,因此正则表达式特殊字符如.
,?
,*
,{{ 1}},[
,...按字面意思处理,而不是正则表达式。为此,请致电Pattern.quote()
。
然后,为了改进代码,您不要扫描文本两次({
和contains()
),并继续扫描您的位置,而不是从头开始,使用变体标准appendReplacement()
循环:
replaceFirst()
输出与以前相同。
作为参考,这是一个更正常的String s = "This is a test";
String substr = " ";
int count = 0;
StringBuffer buf = new StringBuffer();
Matcher m = Pattern.compile(Pattern.quote(substr)).matcher(s);
while (m.find()) {
m.appendReplacement(buf, "");
String ss = buf + s.substring(m.end());
System.out.println("doSomeBusinessLogic(\"" + ss + "\")");
count++;
}
// not needed here, but loop usually ends with: m.appendTail(buf);
System.out.println("count = " + count);
循环,用appendReplacement
值替换空格:
count