[LeetCode] #20 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

输入:s = "()[]{}"

输出:true

输入:s = "([)]"

输出:false

输入:s = "{[]}"

输出:true

看到这道题目,让我想到了之前的[LeetCode] #13 罗马数字转整数

因为这两道题目都要分析一串有一定规则的字符串,所以我再次使用了替换法。

首先,我们需要看有效的字符串有什么共同点。可以发现一个有效的字符串至少会有一组相邻的括号。

然后,我们将这些相邻的括号去掉(替换为“”),会发现部分不相邻的一组括号相邻了。反复如此,最终字符串变成了空串。

而无效字符串会在这个过程中找不到相邻的一组括号。

class Solution {
    public boolean isValid(String s) {
        int length = s.length() / 2;
        for (int i = 0; i < length; i++) {
            s = s.replace("()", "").replace("{}", "").replace("[]", "");
        }
        return s.length() == 0;
    }
}

这个解法虽然挺简洁,但耗时较长。翻找评论区找到了一个低耗时的解法。

栈的特性完美的契合了题目

class Solution {
    public boolean isValid(String s) {
       Stack<Character>stack = new Stack<Character>();
        for(char c: s.toCharArray()){
            if(c=='(')stack.push(')');
            else if(c=='[')stack.push(']');
            else if(c=='{')stack.push('}');
            else if(stack.isEmpty()||c!=stack.pop())return false;
        }
        return stack.isEmpty();
    }
}

知识点:

stack.pop() 和 stack.peek()

相同点:大家都返回栈顶的值。

不同点:peek 不删除栈顶的值,pop会把栈顶的值删除。

总结:有的时候,可以思考题目是否满足了某个数据结构的特性

posted @ 2021-07-19 15:54  1243741754  阅读(31)  评论(0编辑  收藏  举报