如何检查大括号是否以正确的顺序关闭?

时间:2017-05-17 20:23:31

标签: regex algorithm

我今天试图解决一个挑战但我做不到。我必须确保字符串的所有大括号都以正确的顺序关闭。

例如,这些是正确的:

{[()]}
{}()[]
{((()))}[]

这些不会:

{[}]
{{)}

我考虑过使用正则表达式,我不能,任何人都可以展示如何做到这一点? (正则表达式或其他方式)。

为了澄清,我不是试图将内容放在大括号内,内部没有任何内容。

2 个答案:

答案 0 :(得分:1)

问题可以通过正则表达式解决,但它不是最快的解决方案。只需删除所有[]{}(),直到字符串不再缩小为止。如果它的长度为0,则表达式是正确的(下面的正则表达式另外允许空格):

document.body.innerHTML = parse('{((()))}[]');

function parse(s) {
    let t;
    do {
        t = s;
        s = s.replace(/ *(\{ *\}|\( *\)|\[ *\]) */g, "");
    } while (t.length != s.length);
    return s.length == 0;
}

答案 1 :(得分:0)

这可以通过使用LIFO stack一次通过字符串来解决。循环遍历字符串,并在每个字符处执行以下操作:

  • 如果当前字符是“左”括号,请将其添加到堆栈中。
  • 如果当前字符是“右”括号,则从堆栈中弹出顶部字符并进行比较。
    • 如果您刚刚找到的“右”支具与堆叠中的“左”支撑相同,则这两个支撑正确匹配。继续。
    • 如果您刚刚找到的“右”支撑与堆叠中的“左”支撑相匹配,则您的大括号出现故障。返回false。
    • 当您尝试弹出时,如果堆栈为空,则会有太多的尾部括号。返回false。

一旦你到达字符串的末尾,只需检查堆栈中的元素数量。

  • 如果堆叠中有任何内容,则会有太多的前导括号。返回false。
  • 如果堆栈为空,则您的大括号是平衡的。返回true。

C#中的示例实现(没有非支撑字符的错误处理):

public static bool IsMatched(string braces)
{
    const string openBraces = "([{";
    const string closeBraces = ")]}";

    Stack<char> stack = new Stack<char>();
    foreach (char c in braces)
    {
        if (openBraces.Contains(c))
        {
            stack.Push(c);
        }
        else if (stack.Count == 0 || openBraces.IndexOf(stack.Pop()) != closeBraces.IndexOf(c))
        {
            return false;
        }
    }
    return stack.Count == 0;
}