Я пытаюсь распаковывать строки, которые выглядят следующим образом:Рекурсивной строка декомпрессия
Входной сигнал: 4 (аb)
Выход: abababab
Вход: 11ab
Выход: aaaaaaaaaaab
Ввод: 2 (3b3 (ab))
Выход: bbbabababbb bababab
Приведенные выше примеры все приходит правильно используя рекурсивный метод ниже, но возникают проблемы, когда я вход что-то вроде:
Входной сигнал: 4 (аb) а
Ожидаемый результат: ababababa
Input : 2 (3B3 (аЬ)) а
Ожидаемый результат: bbbabababbbbabababa
Я понимаю, что проблемы возникают, когда в го e return statement "return repeat". В текущем состоянии рекурсия продолжается до тех пор, пока она не попадет в конец входной строки даже после окончания круглой скобки. В основном я не знаю, как заставить его сломаться, если достигнет конечной круглой скобки, а затем продолжить, если что-то осталось. В 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' is' bbbabababbbbabababa' –
Забавная проблема. Вы можете использовать рекурсивный парсер спуска и небольшую грамматику BNF. Тогда вы можете ударить код примерно через 10 минут. –
ok, добавлен пример кода JavaScript. –