0
点赞
收藏
分享

微信扫一扫

20.有效的括号

陆公子521 2022-02-02 阅读 94

难度:简单

目录

一、问题描述

二、思路

1、解题思路

2、极端情况的判断

3、解决极端情况

三、解题

1、代码实现

2、时间复杂度 and 空间复杂度

四、总结


一、问题描述

这里直接采用的是LeetCode上面的问题描述。

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

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

下面给出示例:

提示:

  • 1 <= s.length <= 104
  • s仅由括号 '()[]{}' 组成

二、思路

1、解题思路

        使用数据结构 完成括号的匹配,遍历 字符串 s ,因为提示中说了,字符串 s 仅由括号'()[]{}'组成,所以当字符分别为:' ( '' [ '' { ' 时,才入栈,否则应该判断是否进行出栈操作。

出栈的情况有三种:

  1. 当栈顶元素为 ' ( ',且当前字符为 ' ) '时;
  2. 当栈顶元素为 ' [ ',且当前字符为 ' ] '时;
  3. 当栈顶元素为 ' { ',且当前字符为 ' } '时。

否则的话即进行入栈操作。

结尾判断栈 是否为空,即 括号 是否一一匹配,空的话说明为 有效的括号 否则就不是。

有这么一些特殊情况可以单独拎出来:

  1. 当字符串 s 的大小为 单数 时,括号肯定不能一一匹配;
  2. 当判断 右括号 时,栈为空,则括号肯定不能一一匹配;
  3. 当判断 右括号 时,不能进行 出栈 操作,则括号肯定不能一一匹配。

以上三种情况,都可以直接说明字符串 s 不是 有效的括号

2、极端情况的判断

在最上述特殊情况进行操作的时候,解决了极端情况。

3、解决极端情况

在特殊情况中解决极端情况。

三、解题

1、代码实现

class Solution {
public:
    bool checkStackTop(char c){
        //栈为空说明没有 左括号 入栈 说明最少会有两个括号不能够匹配
        if(p.empty()){
            return true;
        }
        char temp = p.top();
        if(c == ')' and temp == '('){
            p.pop();
            return false; 
        }else if (c == ']' and temp == '['){
            p.pop();
            return false;
        }else if(c == '}' and temp == '{'){
            p.pop();
            return false;
        }
        // 如果不能出栈的话 则说明最少会有两个括号不能够匹配
        else{
            return true;
        }
    }
    bool isValid(string s) {
        // 括号数为单数 则肯定不能完全匹配
        if(s.size() % 2 ){
            return false;
        }
        for(char& item: s){
            if(item == '(' or item == '{' or item == '['){
                p.push(item);
            }
            else{
                if(checkStackTop(item)){
                    return false;
                }
            }
        }
        return p.empty();
    }
private:
stack<char> p;
};

 

2、时间复杂度 and 空间复杂度

时间复杂度:O(n)n 为字符串 s 的大小

空间复杂度:O(n)

四、总结

        这一题还是比较经典的题目,以前只会盲目的 进栈 出栈 ,现在优化了一些特殊情况,可以提高效率 和 降低 栈使用的空间。

举报

相关推荐

0 条评论