[001] [LeetCode刷题记录] 20-有效的括号

LeetCode
刷题记录
题目描述
解题思路及代码
C语言实现
C++语言实现
Python3语言实现

1 题目描述

LeetCode原题链接:20. 有效的括号

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

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

提示:

  • 1 <= s.length <= 1 0 4 10^4 104
  • s 仅由括号 ‘()[]{}’ 组成

2 解题思路及代码

2.1 C语言实现

/**
 * @note
 * 左括号入栈,右括号与栈顶左括号匹配则栈顶左括号出栈
 * 合法:循环结束且栈空
 * 非法:1.栈空且输入右括号
 *      2.输入与栈顶左括号不匹配的右括号
 *      3.循环结束且栈非空
 * 注意:有效字符串的长度一定为偶数,若字符串的长度为奇数可以直接返回False
 */
 
typedef struct Snode{
    char data;
    struct Snode *next;
}SNode, *LinkStack;

bool isValid(char * s){
    LinkStack S = NULL;
    int n = strlen(s);
    if (n % 2 == 1) {
        return false;
    }
    while(*s != '\0'){
        if(*s == '(' || *s == '{' || *s == '['){    // 入栈
            SNode* p = (SNode*)malloc(sizeof(SNode));
            p->data = *s;
            p->next = S;
            S = p;
        }else{
            if(S == NULL)
                return false;
            if((S->data == '(' && *s == ')') || (S->data == '[' && *s == ']') || (S->data == '{' && *s == '}')){
                SNode* ptr = S;
                S = S->next;
                free(ptr);
            }else{
                return false;
            }
        }
        s++;
    }
    return S == NULL;
}

复杂度分析:

  • 时间复杂度:O(n),n为字符串的长度

  • 空间复杂度:O(n),栈中存储的字符数量为n个

2.2 C++语言实现

// 解题思路同C

class Solution {
public:
    bool isValid(string& s) {
        int str_len = s.size();
        if(str_len % 2 == 1){     // 字符串长度为奇数直接返回
            return false;
        }
        unordered_map<char, char> pairs = {     // 利用unordered_map容器实现时间复杂度为O(1)的查找
                {')', '('},
                {'}', '{'},
                {']', '['},
        };

        stack<char> stk;
        for(size_t i = 0; i < str_len; i++){    // 也可以使用 for(char &ch : s)遍历字符串 (C++11及以上支持这种用法)
            if(pairs.count(s[i]) == 1){         // 当前字符为右括号
                if(stk.empty())
                    return false;
                if(stk.top() != pairs[s[i]])
                    return false;
                stk.pop();
            }else{
                stk.push(s[i]);
            }
        }
        return stk.empty();     // 判断最后栈是否已空
    }
};

2.3 Python3语言实现

# 解题思路同C

class Solution:
    def isValid(self, s: str) -> bool:
        if len(s) % 2 == 1:
            return False
        pairs = {')': '(', '}': '{', ']': '['}
        stack = []
        for c in s:
            if c in pairs:  # 判断的是字典的键,即右括号
                if not stack:
                    return False
                elif stack[-1] != pairs[c]:
                    return False
                stack.pop()
            else:
                stack.append(c)
        return stack == []

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯西的彷徨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值