发布于 2026-01-06 1 阅读
0

有效括号,解决 Facebook 面试题。

有效括号,解决 Facebook 面试题。

这是最常见的筛选问题之一,尤其是在 HackerRank 进行面试时,他们很可能会问到这个问题。我被 HackerRank 问了四次同样的问题。

问题:给定一个仅包含字符'(', ')', '{', '}', '['和']'的字符串,判断该输入字符串是否有效。

输入字符串有效需满足以下条件:
左括号必须用同类型的括号闭合;
左括号必须按正确的顺序闭合;
空字符串也被视为有效。

例如:



   string = "()[]{}"              //valid
   string = "[{()]}"              //invalid
   string = ""                    //valid


Enter fullscreen mode Exit fullscreen mode

我们来解决这个问题。

最基本的,这个问题要求我们找到匹配的左括号和右括号。所以对于以下情况:
`(", ")` 是有效的右括号
,`{", "}` 是有效的右括号
,`"[", "]` 是有效的右括号。

换句话说,我们可以说这些“对”相互抵消,由此我们可以说顺序很重要。

一个好的数据结构可以帮助我们:
1 > 存储括号并在找到匹配项时取消它们;
2 > 跟踪括号。

是栈。我们将左括号压入栈中,遇到右括号时将其弹出,同时我们还可以检查弹出的右括号是否与左括号匹配。

实施 - 1

这里我们可以做一个小优化,检查字符串长度是否为偶数。如果不是偶数,显然该字符串无效。
将上述想法转化为代码:



var isValid = function(S) {
    let stack = [];
    if(S == '') return true;
    if(S%2 != 0) return false;
    for(let s of S){
        if(s == '(' || s == '{' || s == '['){
            stack.push(s);
        }else{
            if(stack.length == 0) return false;
            let c = stack.pop();
            if(c == '(' && s != ')'){
                return false;
            }
            if(c == '{' && s != '}'){
                return false;
            }
            if(c == '[' && s != ']'){
                return false;
            }
        }
    }

    if(stack.length != 0) return false;      // for conditions like "{([])}}}" 
    return true;
};


Enter fullscreen mode Exit fullscreen mode

现在这样运行良好,但我们还能做得更好吗?仅仅为了检查“配对”,就用了太多 if-else 条件语句。让我们尝试让它更简洁一些。

实施方案 - 2

由于if条件的主要工作是匹配括号,我们使用另一种数据结构,即哈希映射。

由于右括号必须与对应的左括号匹配,因此我们建立了右括号和左括号之间的映射关系。

替代文字

该算法的工作原理如下:
1 > 检查当前符号是否在哈希表中,如果不在,则将其压入栈中。2
> 如果当前符号在哈希表中,则从栈中弹出并将其与哈希表中对应条目的值进行比较。

因此,如果当前符号的顶部是“)”,则我们从栈中弹出该符号,并将弹出的值与哈希映射中与“)”对应的值“(”进行比较,如果它们不相同,则该字符串无效。

代码会解释得很清楚。



var isValid = function(S) {

    if(S == '') return true;
    if(S.length%2 != 0) return false;

    let map = {};
    map[")"] = "(";
    map["}"] = "{";
    map["]"] = "[";

    console.log(map);

    let stack = [];
    for(let s of S){
        if(!map[s]){
            stack.push(s);
        }else{
            if(stack.length == 0) return false;
            let c = stack.pop();
            if(c != map[s]) return false;
        }
    }

    if(stack.length !=0) return false;
    return true;
};


Enter fullscreen mode Exit fullscreen mode

希望我的解释对您有所帮助。如果您有更好的解决方法,请与我们分享 :)

github:https://github.com/AKHILP96/Data-Structures-and-Algorithms/blob/master/problems/ValidParentheses.js

文章来源:https://dev.to/akhilpokle/valid-parentheses-solving-a-facebook-interview-question-410o