2016-11-14 2 views
-4

Учитывая строку, содержащую одну пару скобок, вычислить рекурсивно новая строка сделаны из только скобки и их содержания, поэтому «хуг (ABC) 123» дает «(а)». parenBit ("хуг (ABC) 123") → "(ABC)"Получение индекса строки связанной ошибки

parenBit ("х (привет)") → "(привет)"

parenBit ("(х) 1") → "(х)"

boolean foundc = false; 
    boolean foundd = false; 

    public String parenBit(String str) { 
     char c = str.charAt(0); 
     char d = str.charAt(str.length() - 1); 


     if(c == '('){ 
      foundc = true; 
      return parenBit(str.substring(0, str.length() - 1)); 

     } 

     if(foundc == false){ 
      return parenBit(str.substring(1, str.length() - 1)); 

     } 

     if(d == ')'){ 
      foundd = true; 
      str.substring(0, str.length() - 1); 

     } 

     if(foundd == false){ 
      return str.substring(0, str.length() - 2); 

     } 


     return ""; 
    } 

Почему это возвращает "индекс Строка из диапазона: 0" ошибка?

+1

Какая строка дает вам ошибку? Вы перешли через это с помощью отладчика? – bradimus

+0

Не могли бы вы разместить полный стек? – XtremeBaumer

+0

Почему бы вам не получить позицию символа '(' char и ')', а затем вернуть то, что находится между ними? Выглядит странно, как вы пытаетесь это сделать. –

ответ

0

С каждой рекурсией вы уменьшаете длину строки, которую вы проверяете. В последней рекурсии у вас будет пустая строка и попытайтесь получить доступ к индексу 0. Добавьте проверку поверх функции, если строка пуста, а если она есть, перерыв.

Вы должны также проверить длину 2, прежде чем звонить str.substring(1, str.length() - 1) или получить другую ошибку индекса.

0

Возможно, вам лучше использовать регулярные выражения. Что-то вроде этого:

var input = "xyz(abc)123(blah)"; 
var exp = @"\((?<content>[^)]*)\)"; 
var matches = System.Text.RegularExpressions.Regex.Matches(input, exp); 

foreach (var match in matches) { 
    // Gets called twice, once for "abc" and once for "blah" 
    var group = match.Groups["content"].Value; 
} 
Смежные вопросы