[英]Removing consecutive duplicates from a string recursively is failing selective test cases
所以手头的任务是递归地从给定的字符串中删除重复项。 例如-
输入: aabccba
Output:ABCBA
我的代码非常适合这个输入和其他 6 个测试用例中的 4 个。 在这两个中,一个是运行时错误,而另一个是说我的代码给出了错误的答案。 有人可以告诉我如何解决这个问题吗?
public static String removeCons(String s) {
if(s.length() == 1) return s;
String ans = "";
String rest = "";
if(s.charAt(0) == s.charAt(1)) {
ans += s.charAt(0);
rest = removeCons(s.substring(2));
}
else {
ans += s.charAt(0);
rest = removeCons(s.substring(1));
}
return ans+rest;
}
尝试aaab
,它会失败(返回aab
)。
当前两个字符相同时,您将保留第一个并跳过第二个,而不检查第三个(以及之后)是否也相同。
相反,跳过第一个,并从第二个开始递归,即
if(s.charAt(0) == s.charAt(1)) {
rest = removeCons(s.substring(1));
}
...
然后可以将该方法重构为:
public static String removeCons(String s) {
if (s.length() <= 1) // fixed to handle empty string too
return s;
String ans = removeCons(s.substring(1));
if (s.charAt(0) != s.charAt(1))
ans = s.charAt(0) + ans;
return ans;
}
除了安德烈亚斯的回答,你可以这样简单地写:
public static String removeCons(String s){
if (s.length() <= 1) return s;
if (s.charAt(0) == s.charAt(1)) return removeCons(s.substring(1));
return s.charAt(0) + removeCons(s.substring(1));
}
我让你我的选择和递归选择。
import java.util.HashSet;
import java.util.Set;
public class RemoveDupes {
public static String removeCons(String s) {
StringBuilder sb = new StringBuilder();
Set<Character> chars = new HashSet();
for (char c : s.toCharArray()) {
if(!chars.contains(Character.valueOf(c))){
sb.append(c);
chars.add(Character.valueOf(c));
}
}
return sb.toString();
}
public static String removeConsRecursive(String s) {
if(s.length() < 2){
return s;
}
String firstLetter = s.substring(0,1);
String sanitized = s.substring(1).replaceAll(firstLetter,"");
return firstLetter + removeConsRecursive(sanitized);
}
public static void main(String... args){
System.out.println(removeCons("sasslaereso"));
System.out.println(removeConsRecursive("sasslaereso"));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.