2016-11-14 51 views
-4

鑑於包含一對括號的字符串的字符串索引,計算 遞歸製成僅括號及其 內容的一個新的字符串,所以「XYZ(ABC)123」產率「( ABC)」。 parenBit( 「XYZ(ABC)123」)→ 「(ABC)」獲取綁定錯誤

parenBit( 「×(你好)」)→ 「(你好)」

parenBit( 「(XY)1」)→ 「(XY)」

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

可以請你發佈完整的stacktrace嗎? – XtremeBaumer

+0

爲什麼你不能獲得'('char和'''char')的位置,然後返回它們之間的內容?看起來很奇怪,你是怎麼做到的 –

回答

0

隨着每次遞歸,您正在減少您檢查的字符串的長度。在最後一個遞歸中,你將有一個空字符串,並嘗試訪問索引0.如果字符串爲空,並且如果是,break時,在函數頂部添加一個檢查。

在致電str.substring(1, str.length() - 1)之前,您還應該檢查長度是2,否則您可能會收到另一個索引錯誤。

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; 
}