繁体   English   中英

以递归方式从字符串中删除连续重复项会导致选择性测试用例失败

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM