检查引号和括号是否平衡

时间:2018-08-13 12:13:32

标签: javascript algorithm

关于如何检查括号是否平衡,有多种解决方案,但我还没有找到一个可以同时检查平衡引号和括号的解决方案。

我一直没有尝试修改此解决方案(codereview - balanced parentheses)以便能够检查引号和括号是否平衡。

例如,这应该是不平衡的("back-to-school)"

原始代码:

function parenthesesAreBalanced(string) {
  var parentheses = "[]{}()",
    stack = [],
    i, character, bracePosition;

  for(i = 0; character = string[i]; i++) {
    bracePosition = parentheses.indexOf(character);

    if(bracePosition === -1) {
      continue;
    }

    if(bracePosition % 2 === 0) {
      stack.push(bracePosition + 1); // push next expected brace position
    } else {
      if(stack.length === 0 || stack.pop() !== bracePosition) {
        return false;
      }
    }
  }

  return stack.length === 0;
}

我的代码-大多数都相似-但添加了不平衡的引号检查。

function areQuotesAndParenthesesBalanced(s: string): boolean {
  const parens = '[]{}()',
      parensStack = [];
  let index, char, numOfQuotes = 0;

  for (index = 0; char = s[index++];){
      const bracePosition = parens.indexOf(char);
      let braceType;

    if (bracePosition === -1 && char !== '"')
        continue;

    braceType = bracePosition % 2 ? 'closed' : 'open';

    //check for double quotes mixed with parentheses
    if(char === '"'){
        const lastInStack = parensStack[parensStack.length - 1];

        numOfQuotes++;

        if(lastInStack === '"'){
            numOfQuotes--;
            parensStack.pop();
        }else if(numOfQuotes > 0 && lastInStack !== '"'){
            return false;
        }else{
            parensStack.push('"');
        }
    }

    if (braceType === 'closed') {
        if (!parensStack.length || parens.indexOf(parensStack.pop()) != bracePosition - 1)
            return false;
    } else {
        parensStack.push(char);
    }
}

//If anything is left on the stack <- not balanced
return !parensStack.length;
}

确定什么是最佳方法对我来说非常棘手。使用括号,您总是知道何时打开或关闭带有引号的内容。

5 个答案:

答案 0 :(得分:2)

您可以尝试将有序的元组放到堆栈上,然后根据其进行检查。

[(,"],
[",)],
[(,"],
[",)]

== ("")("") example of a balanced stack.

[",(],
[",(],
[),"],
[),"]

== "("()")" another balanced stack


[(,"],
[),"]

== (")" trivial unbalanced stack

[(,)] <- trivial item, can ignore in implementation
[","] <- trivial item, can ignore in implementation

[",(],
[),(],
[),"]

== "()()" balanced stack

我实在太累了,无法实际执行此操作,但希望它能为您提供一些想法和说明性示例,我睡一会儿后将对其进行重新讨论。

答案 1 :(得分:2)

Ids

答案 2 :(得分:1)

这将以两种方式对push()的{​​{1}}或pop()进行检查。

  • 如果堆栈为空或堆栈中的最后一个字符不等于",则将此"插入堆栈。

  • 如果堆栈不为空并且堆栈中的最后一个字符等于",则堆栈本身中的" pop()。这样做是因为我在这里进行了一种贪婪匹配,因为已经堆栈"的{​​{1}}意味着计算了"中的表达式。因此,我们可以安全地匹配这两个"并进行下一个。

效果很好,但无论如何都请通知我。

"..."

输出

"

答案 3 :(得分:0)

一种简单的方法可能仅对于第一个括号是这样的:

var

答案 4 :(得分:-1)

   function isParenthesisBalanced(_str) {
 var parenMap = {'{':'}', '[':']', '(':')'};
 var parenStack =[];

 for(var i=0;i<_str.length; i++) {
     if(_str[i] in parenMap) {
         parenStack.push(_str[i]);
     } else if(Object.values(parenMap).indexOf(_str[i]) != -1) {
        if(parenMap[parenStack.pop()] != _str[i]) return false;
     }
 }
 return true;
}