пытаюсь найти рекурсивный метод, который возвращает строку между двумя круглыми скобками

#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 вы не можете (вы не должны этого делать, потому что, опять же, вы можете испортить его, установив неправильные значения при первом вызове).