通过递归确定嵌套括号(JAVA)

时间:2014-04-22 00:34:55

标签: java if-statement recursion parentheses

我正在尝试编写一个方法来确定字符串中嵌套的括号对。 例子:  "(())"是真的 "((4))"是假的 "()()"是假的 "((())"是假的

public static boolean nestedBrackets(String s){
if(s.length()<4){
return false;
}
  else if(s.charAt(0) == '('&&s.charAt(s.length()-1)== ')'){

    if(s.charAt(1)=='('&&s.charAt(s.length()-2)==')'&&s.length()==4){
        return true;
    }
        else if(s.charAt(2)=='(' && s.charAt(s.length()-3)==')'&&s.length()==6){
        return true;
        }

    else {
      return false;
    }
  }  
  else {
     return false;

2 个答案:

答案 0 :(得分:2)

由于您的问题被标记为&#34;递归,&#34;提供递归解决方案。

public static boolean nestedBrackets(String s)
{
    if (s.length() < 2)
    {
        return false;
    }
    if (s.charAt(0) != '(')
    {
        return false;
    }
    if (s.charAt(s.length() - 1) != ')')
    {
        return false;
    }
    if (s.length() == 2)
    {
        return true;
    }
    return nestedBrackets(s.substring(1, s.length() - 1));
}

实施很简单。对于每次递归,请确保整个表达式在括号内,然后递归括号内的内容。达到一对括号的终端条件:&#34;()&#34;。

注意:您没有提到空字符串大小写的预期结果(&#34;&#34;)。下面提供的上述解决方案为空字符串返回false

答案 1 :(得分:0)

为了递归地执行此操作,我们需要考虑归纳。所以我的基本情况是:

  1. 没有留下哪个返回true
  2. 一个未配对的paren,返回false
  3. 我的归纳步骤是:

    从左边开始找到第一个(如果我找到a)然后返回false

    从右边开始,找到第一个)如果我找到了(返回false

    如果我从右边找到(从左边和a),然后将字符串缩小到它们之间的子字符串并递归。

    因此,伪代码看起来像:

     Public Boolean ParenFinder(String testString){
         int left = 0;
         int right = 0;
         for (int i = 0; i < testString.length(); i++){
             if (testString.charAt(i) == '('){
                    left = i;
                    break;
             }
             if (testString.charAt(i) == ')'){
                   return false;
             }
         }
         for (int i = testString.length(); i > 0; i--){
             if (testString.charAt(i) == ')'){
                    right = i;
                    break;
             }
             if (testString.charAt(i) == '('){
                   return false;
             }
         }
    
         if (left == 0 && right == 0 && testString.charAt(0) != '(')
                      return true;
         return (ParenFinder(testString.subString(left, right));              
     }