【问题标题】:Removing consecutive duplicates from a string recursively is failing selective test cases以递归方式从字符串中删除连续重复项会导致选择性测试用例失败
【发布时间】:2020-04-28 14:17:43
【问题描述】:

因此,手头的任务是递归地从给定字符串中删除重复项。例如-

输入:aabccba

输出: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;
}

【问题讨论】:

  • "aabccba".replaceAll("(.)\\1+", "$1");
  • 什么是运行时错误? “错误答案”是什么?
  • @Fubar 我正在在线平台上运行此代码,不幸的是,这就是所有结果。
  • @SthitaprajnaMishra 然后在本地运行它,这样您就可以使用各种输入自行测试它。

标签: java string recursion


【解决方案1】:

尝试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;
}

【讨论】:

    【解决方案2】:

    除了安德烈亚斯的回答,你可以这样简单地写:

    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));
    }
    

    【讨论】:

    • 如果你想要brief,然后将方法体压缩到:return (s.length() &lt;= 1 ? s : s.substring(0, (s.charAt(0) == s.charAt(1) ? 0 : 1)) + removeCons(s.substring(1)));。 ---- 更好的是:return s.replaceAll("(.)\\1+", "$1");
    • 你为我打开了新的视野。你有没有关于使用 replaceall 正则表达式的文章,我对此不太了解(对不起语法,英语不是我的母语)
    • 好吧,我从comment 偷来的正则表达式。
    【解决方案3】:

    我让你我的选项和递归选项。

        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"));
        }
    

    }

    【讨论】:

      猜你喜欢
      • 2018-12-10
      • 2018-08-05
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      相关资源
      最近更新 更多