n对括号的所有有效组合

时间:2015-03-28 18:38:32

标签: javascript

  • 我正在学习js ..
    • 我正在尝试编写一个简单的js程序..
    • 我要做的是打印所有有效的n对组合 括号(正确打开和关闭)
    • eg(),(()()),(())
    • 我写过逻辑你能告诉我它是否正确

https://jsfiddle.net/e7mcp6xb/

module.exports = Parentheses = (function() {
  var _isParenthesesMatch = function(str) {
    var parentheses = str.length;
    var rightParentheses = '(';
    var leftParentheses = ')';
    var rightCount = 0;
    var leftCount = 0;

    for(i=0;i<=str.length;i++){
       if(rightParentheses == str.charAt(i))
       {
          rightCount++;
       }
       else if(leftParentheses == str.charAt(i))
       {
          leftCount++;
       }
    }

    if(rightCount == leftCount){
      return true;
    }
    else(rightCount != leftCount){
      return false;
    }

  }

}());

4 个答案:

答案 0 :(得分:5)

检查错误,但您可以轻松修复:在for循环的每个步骤中,左括号的数量不能小于结束括号的数量:

if (rightCount < leftCount)
    return false;

整个功能应如下所示:

function(str) {
    var rightParentheses = '(';
    var leftParentheses = ')';
    var rightCount = 0;
    var leftCount = 0;

    for (var i = 0; i <= str.length; i++) {
       if (rightParentheses == str.charAt(i))
          rightCount++;
       else if (leftParentheses == str.charAt(i))
          leftCount++;

       if (rightCount < leftCount)
          return false;
    }

    return rightCount == leftCount;
}

如果您想生成所有有效字符串,可以使用此功能:

function nPair(n) {
    if (n == 0)
        return [""];

    var result = [];
    for (var i = 0; i < n; ++i) {

        var lefts = nPair(i);
        var rights = nPair(n - i - 1);

        for (var l = 0; l < lefts.length; ++l)
            for (var r = 0; r < rights.length; ++r)
                result.push("(" + lefts[l] + ")" + rights[r]);
    }

    return result;
}

// result of nPair(3):
// ["()()()", "()(())", "(())()", "(()())", "((()))"]

答案 1 :(得分:0)

这是错误的,因为你的函数在这个例子中将返回true))((或this())(()

答案 2 :(得分:0)

您的功能有误,请尝试检查左右括号和平衡:

function isValid(str){
  var stripedStr = str.replace(/[^\(\)]+/g, '');

  return stripedStr.split('').reduce(function(a, b){
    return a > -1 ? b === '(' ? a + 1 : a - 1 : -1;
  }, 0) === 0;
}
  • stripedStr - 使用replace()删除任何非()的字符。
  • split('') - 返回一个数组,以便我们可以使用reduce
  • reduce() - 对累加器应用函数,并且数组的每个值(从左到右)必须将其减少为单个值。
    • reduce从0开始作为初始值,而在reduce函数中我们计算括号
      +1(-1)
    • 如果我们的计数器永远不会低于0,我们的字符串有效,我们最终会得到0

您也可以像这样编写reduce函数:

function(previousValue, currentValue){
  if (previousValue > -1){
    if (currentValue === '('){
      return previousValue + 1;
    } else {
      return previousValue - 1;
    }
  }

  return -1;
}

这相当于:

function(a, b){
  return a > -1 ? b === '(' ? a + 1 : a - 1 : -1;
}

答案 3 :(得分:0)

试试这个,我稍微修改了你的代码。修改及其解释在评论中标出。

module.exports = Parentheses = (function() {
  var _isParenthesesMatch = function(str) {
    var parentheses = str.length;
    var rightParentheses = '(';
    var leftParentheses = ')';
    var count=0;

    for(i=0;i<str.length;i++){
        //this is to check valid combination start always from ( and end with )
            if(str.charAt(0)==rightParentheses && str.length-1==leftParentheses) 
            {
               if(rightParentheses == str.charAt(i))
               {
                  count++;  //this will calculate how many times rightParentheses is present & increment count by 1
               }
               else if(leftParentheses == str.charAt(i))
               {
                  count--;  //this will simply decrement count to match valid sequence
               }
            }

            if(count==0){
              return true;
            }


  }

}());