【发布时间】:2016-12-03 19:11:43
【问题描述】:
我正在尝试解压缩如下所示的字符串:
输入:4(ab)
输出:abababab
输入:11ab
输出:aaaaaaaaaab
输入:2(3b3(ab))
输出:bbbabababbbbababab
上面的例子都使用下面的递归方法正确显示,但是当我输入如下内容时会出现问题:
输入:4(ab)a
预期输出:ababababa
输入:2(3b3(ab))a
预期输出:bbbabababbbbabababa
我意识到返回语句“return 重复”中出现的问题。在其当前状态下,递归将继续,直到它到达输入字符串的结尾,即使在结束括号之后也是如此。基本上我不知道如何让它在到达结尾括号时中断,然后如果还有任何剩余则继续。在 2(3b3(ab))a 中它应该返回 2*(3b3(ab))+a,现在它返回 2*(3b3(ab))a。非常感谢任何帮助,因为我无法理解它。
public static String decompress(String compressedText) throws Exception
{
//BASE CASE
if(compressedText.length() == 1)
{
if(compressedText.charAt(0) == ')')
{
System.out.println("1: " + compressedText);
return "";
}
else
{
System.out.println("2: " + compressedText);
return compressedText;
}
}
//END BASECASE
if(compressedText.charAt(0) == '(')
{
System.out.println("3: " + compressedText);
return decompress(compressedText.substring(1));
}
//IF DOUBLE DIGIT
if(Character.isDigit(compressedText.charAt(0)) == true && Character.isDigit(compressedText.charAt(1)) == true)
{
if(compressedText.charAt(3) != '(')
{
System.out.println("4: " + compressedText);
int i = Integer.parseInt(compressedText.substring(0,2));
String repeated = new String(new char[i]).replace("\0", compressedText.substring(2,3));
return repeated + decompress(compressedText.substring(3));
}
else
{
System.out.println("5: " + compressedText);
int i = Integer.parseInt(compressedText.substring(0,2));
String repeated = new String(new char[i]).replace("\0", decompress(compressedText.substring(2)));
return repeated;
}
}
//END DOUBLE DIGIT
//IF SINGLE DIGIT
if (Character.isDigit(compressedText.charAt(0)) == true)
{
if(compressedText.charAt(1) !='(')
{
System.out.println("6: " + compressedText);
int i = Integer.parseInt(compressedText.substring(0,1));
String repeated = new String(new char[i]).replace("\0", compressedText.substring(1,2));
return repeated + decompress(compressedText.substring(2));
}
else
{
System.out.println("7: " + compressedText);
int i = Integer.parseInt(compressedText.substring(0,1));
String repeated = new String(new char[i]).replace("\0", decompress(compressedText.substring(1)));
return repeated;
}
}
//END SINGLE DIGIT
//IF RIGHT PARENTHESIS
if (compressedText.charAt(0) == ')')
{
if (compressedText.charAt(1) != ')')
{
System.out.println("8: " + compressedText);
return "";
}
else
{
System.out.println("9: " + compressedText);
return decompress(compressedText.substring(1));
}
}
//END
System.out.println("10: " + compressedText);
return compressedText.charAt(0)+decompress(compressedText.substring(1));
}
【问题讨论】:
-
2(3b3(ab))a的预期输出为bbbabababbbbabababa -
有趣的问题。您可以使用递归下降解析器和一点 BNF 语法。然后你可以在大约 10 分钟内完成代码。
-
好的,添加 JavaScript 代码示例。
标签: java algorithm recursion nested compression