#java #recursion
#java #рекурсия
Вопрос:
в строке есть только одна пара круглых скобок, и они сбалансированы, я не могу использовать методы, которые внутренне используют циклы for, такие как contain и т. Д., А регулярные выражения запрещены.
Вот код, который я придумал, но он всегда показывает ошибку.
public static String getParenthesis(String str) {
int first = 1 , last = str.length()-2;
if(str.charAt(0) =='(')
{
first = 0;
}
if (str.charAt(str.length()-1) == ')')
last ;
if(str.charAt(str.length()-1) == ')'amp;amp; str.charAt(0)=='(')
return str;
return getParenthesis(str.substring(first, last));
}*/
Комментарии:
1. Пожалуйста, предоставьте сообщение об ошибке.
2. Что означает, что пара круглых скобок сбалансирована ?
Ответ №1:
Так, например, учитывая входную строку:
Paren(thesis)String
вы хотите напечатать:
thesis
Давайте рассмотрим эту строку как массив символов и введем два индекса: first
и size
.
first size (== str.length())
| |_
str: P a r e n ( t h e s i s ) S t r i n g |_|
Вы хотите увеличивать first
, пока не дойдете до левой фигурной скобки — (
.
Вы хотите уменьшить size
значение, пока не дойдете до правой фигурной скобки — )
.
Остальное — это просто правильное управление индексами для удовлетворения String
‘s substring()
.
public static String getParenthesis(String str) {
int first = 0, size = str.length();
if (str.charAt(first) != '(')
return getParenthesis(str.substring(first 1, size));
if (str.charAt(size - 1) != ')')
return getParenthesis(str.substring(first, size - 1));
return str.substring(first 1, size - 1);
}
Ответ №2:
Чтобы заставить рекурсивные функции работать должным образом, вам нужно использовать дополнительные параметры, но обычно вы не хотите обращаться с этим в своей общедоступной функции, поэтому вы можете исправить это с помощью другой функции. Ваша общедоступная функция не будет рекурсивной, в то время как ваша частная функция будет.
public class HelloWorld {
private static String getParenthesisRec(String str, String res, boolean parenthesisFound) {
if (str.length() == 0) {
// Just in case...
return "";
}
char currentChar = str.charAt(0);
if (parenthesisFound amp;amp; currentChar == ')') {
// Gotcha!
return res;
} else if (parenthesisFound amp;amp; currentChar != ')') {
res = currentChar;
}
String substring = str.substring(1, str.length());
if (currentChar == '(') {
return HelloWorld.getParenthesisRec(substring, "", true);
}
return HelloWorld.getParenthesisRec(substring, res, parenthesisFound);
}
public static String getParenthesis(String str) {
return HelloWorld.getParenthesisRec(str, "", false);
}
public static void main(String []args) {
System.out.println(HelloWorld.getParenthesis("Example t(o StackOver)flow"));
}
}
Как вы можете видеть, я просто использую общедоступный getParenthesis для настройки моей рекурсивной и частной функции getParenthesisRec. Опять же, вы могли бы использовать одну единственную функцию с дополнительными параметрами, но это было бы беспорядочно, потому что вы должны убедиться, что при первом вызове вы передаете правильные первые значения для этих параметров. Это не обязательно в таких языках, как Python, где вы можете установить значения по умолчанию для своих параметров, но в Java вы не можете (вы не должны этого делать, потому что, опять же, вы можете испортить его, установив неправильные значения при первом вызове).