Hackerrank减少字符串

时间:2016-09-26 08:35:27

标签: java algorithm

我正在处理以下问题https://www.hackerrank.com/challenges/reduced-string

我想以递归方式解决上述问题。我的代码如下。

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(neInputStreamReader(System.in));
        String line = br.readLine();
        System.out.print(reduce(line));  
    }

    public static String reduce (String str) {
        if (str.equals("")) return "Empty String";
        if (str.length()<2) return str;
        if (str.charAt(0) == str.charAt(1)) return reduce(str.substring(2));
        return str.charAt(0) + reduce(str.substring(1));
    } 
}

上述代码因以下测试用例而失败 BAAB

任何人都可以指出我的代码中存在什么问题吗?

2 个答案:

答案 0 :(得分:0)

str.charAt(0)+reduce(str.substring(1));

如果charAt(0)str.substring(1)的第一个字符相等,该怎么办?你完成了未减少的一对。

答案 1 :(得分:0)

你的问题是:

reduce("baab") = 'b' + reduce("aab") = 'b' + reduce("b") = 'b' + 'b' = "bb"

你只能查看你的第一个角色,直到你不能立即删除它为止。然后你永远不会再看它,即使在之后的某个时刻你实际上可以删除它。

我想你可以做这样的事情:

public static String reduce(String str){
    if(str.equals(""))
        return "Empty String";
    if(str.length()<2)
        return str;
    if(str.charAt(0)==str.charAt(1))
        return reduce(str.substring(2));

    String rest = str.substring(1);
    String reducedRest = reduce(rest);

    if (rest.equals(reducedRest)) 
        return str;
    else 
        return reduce(str.charAt(0) + reducedRest);
} 

它并不好,但它应该向你展示一般的想法。现在你只忽略第一个字符,如果你不改变其余的。如果你确实改变它,你需要再看一遍。