通过在java中搜索和删除旧子字符串来创建子字符串的最快方法是什么?

时间:2017-08-25 20:29:58

标签: java string

我的业务逻辑很奇怪,但总之,我会在这里解释一下。 我必须删除子字符串的第一个或最后一个出现,然后重复该过程。我认为下面的代码到目前为止工作正常。现在我想知道如何优化它,因为它对大输入(字符串长度为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"));

        }



    }

1 个答案:

答案 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