获取绑定错误的字符串索引

时间:2016-11-14 14:27:32

标签: java algorithm

  

给定一个包含一对括号的字符串,计算   递归地由一个由括号和它们组成的新字符串   内容,所以" xyz(abc)123"收益率"(abc)"。 parenBit(" xyz(abc)123")→   "(ABC)"

     

parenBit(" x(你好)")→"(你好)"

     

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

为什么这会返回" String索引超出范围:0"错误?

2 个答案:

答案 0 :(得分:0)

每次递归都会缩短您检查的字符串的长度。在最后一次递归中,您将有一个空字符串并尝试访问索引0.如果字符串为空,则在函数顶部添加一个检查,如果是,则为break。

在调用str.substring(1, str.length() - 1)之前,您还应检查长度为2,否则可能会出现另一个索引错误。

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