我需要编写一个接收字符串并删除相邻重复项的函数。
示例:
输入->“ aabbaabbcccaaa”
输出->“ ababca”
我尝试解决以下问题:
public String remdups(String input) {
String response = "";
char temp;
int i, length = input.length();
for(i = 0; i < length; i++) {
temp = input.charAt(i);
response += temp;
while(i < length && input.charAt(i) == temp) i++;
}
return response;
}
但是似乎时间复杂度未达到预期,我该如何提高性能或哪种方法更好? 我知道这是一个非常简单的问题,但我找不到改善的方法或另一种解决方法。
答案 0 :(得分:3)
对我来说,从复杂性的角度来看,您的代码看起来已经不错。它仅通过字符串一次。您可以通过使用String
对响应StringBuilder
进行优化,也许只是为了提高可读性而简化了循环(不需要2个嵌套循环,并增加了i
计数器)从两个地方可能会引入错误。)
public String remdups(String input) {
StringBuilder response = new StringBuilder(input.length());
char temp;
for (int i = 0; i < input.length(); i++) {
char next = input.charAt(i);
if (temp != next) {
temp = next;
response.append(temp);
}
}
return response.toString();
}
答案 1 :(得分:2)
为什么不尝试使用正则表达式?像这样:
public static void main(String[] args) {
String str = "aabbaabbcccaaa";
System.out.println(str.replaceAll("(.)\\1+","$1"));
}
输出:
ababca
修改:
供以后参考,这种方法的运行速度实在太慢了。我用JMH进行了基准测试,它比短字符串的非正则表达式解决方案慢大约4倍,而长字符串(约1万个字符)只会使情况变得更糟。