如何递归地解压缩java中的给定字符串?

时间:2011-11-27 23:53:50

标签: java string recursion

这很容易使用迭代但我必须使用递归来做到这一点。我试着计算字符串中字符出现次数的多少次,字符串和输出的位置和其余部分。

public static String uncompress(String compressedText) {

        return uncompress(compressedText, 1, 0, "");

    }

    public static String uncompress(String text, int count, int pos, String output) {

        if (text.equals("")) {

            return "";
        }

        if (Character.isLetter(text.charAt(pos))) {

            output += text.charAt(0);
            pos++;
        }

        else if(Character.isDigit(text.charAt(pos))) {

            count = text.charAt(pos) - '0';
            output += text.charAt(pos + 1);
            count++;
            pos++;

        }

        text = text.substring(pos + 1);

        uncompress(text, count, pos, output);

        return output;
    }

2 个答案:

答案 0 :(得分:2)

您的代码中存在多个错误,例如:

  • 你正在进行分组,但也要在一个位置上传球,你应该做一个或另一个
  • 您的基本案例正在返回“”,但它应该返回累积字符串'output'
  • 你递归你忽略返回方法的输出,只返回当前方法的输出,所以递归没有建立任何东西

下面是仅使用递归来解析字符串并构建输出的代码。我添加了注释以显示代码中发生的情况。请注意,特别是在递归中,打印当前状态非常有用,这样您就可以看到每个阶段发生了什么,所以我也添加了它。

请注意,getMultiple()方法本身就是递归应该如何工作的一个非常简单的例子 - 你调用相同的方法但是A)传入当前调用中完成的一些工作,以便它可以由基本情况或B)获取方法的输出并在返回修改后的输出之前添加内容/修改它。

public class Recursion {

public static void main(String[] args) {
    System.out.println(uncompress("10a2b"));
}

public static String uncompress(String compressedText) {

    return uncompress(compressedText, "", "");

}

public static String getMultiple(char x, int N) {
    if (N == 0) return "";

    return ""+x+getMultiple(x,N-1);
}

public static String uncompress(String text, String count, String output) {
    System.out.println("----");
    System.out.println("TEXT:"+text);
    System.out.println("COUNT:"+count);
    System.out.println("OUTPUT:"+output);


    if (text.equals("")) {
        //base case - no text left to parse

        return output;
    }

    if (Character.isLetter(text.charAt(0))) {
        //letter case - need to take the count we have accrued, parse it into an integer and add to output

        System.out.println(count);// * text.charAt(0);

        output += getMultiple(text.charAt(0),Integer.parseInt(count));

        count = "";
    }

    else if(Character.isDigit(text.charAt(0))) {
        //digit case - need to add to the count but keep as a string because must be parsed later

        count += (""+text.charAt(0));

    }

    //parse the *remainder* of the string, one character at a time, so pass in the substring(1)


      return uncompress(text.substring(1), count, output);
    }
}

答案 1 :(得分:1)

假设输入String的格式正确,请尝试:

public static String uncompress(String compressedText) {
    if (compressedText.length() == 0)
        return "";
    return uncompress(compressedText, charToInt(compressedText, 0), 0);
}

public static String uncompress(String text, int count, int pos) {
    if (pos == text.length() || (pos == text.length()-2 && count == 0))
        return "";
    else if (count == 0)
        return uncompress(text, charToInt(text, pos+2), pos+2);
    return text.charAt(pos+1) + uncompress(text, count-1, pos);
}

public static int charToInt(String str, int idx) {
    return str.charAt(idx) - '0';
}