动手刷LeetCode-判断括号有效


给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

知识点

字符串知识点:string s:常见操作方法;

解题思路

解法一:栈配对法 ;这是一个有技术含量的算法
定义res作为一个栈
遍历整个字符串,将每个左括号加入res
当发现右括号时,就查栈顶元素:
若不是其对应的左括号,直接返回false;
若是,该元素出栈,检查字符串中下一个元素;

class Solution {
public:
    bool isValid(string s) {
        // 使用栈 配对法 栈是属于算法层次
        vector<char> ans={'?'};  // vector容器即可当做一个栈空间,?只是来压栈第一个字符
        int i ;           // 定义循环变量
        int len=s.length(); // 字符串长度
        char c = s[0]; // 移动接收字符串
        char cc;    //接收栈顶元素
        if(len%2==1){
            return false;
        }

        for(i=0;i<len;i++){
            c=s[i];
            if(c==']' || c=='}'||c==')'){
                cc=ans.back(); // 取出栈顶元素
                if(cc==c-1||cc==c-2) {     // 在ASC中相对扩韩要么相差1,要么相差2
                    ans.pop_back(); // 删除栈顶元素
                } else{
                    return false;
                }
            
            }else{
                ans.push_back(c);
            }

            

        }
        if(ans.back()=='?'){
            return true;
        }
        else{
            return false;
        }
    }
};

哈希表法

如果 c 是左括号,则入栈 pushpush;
否则通过哈希表判断括号对应关系,若 stack 栈顶出栈括号 stack.pop() 与当前遍历括号 c 不对应,则提前返回 falsefalse。

class Solution:
    def isValid(self, s: str) -> bool:
        dic = {'{': '}',  '[': ']', '(': ')', '?': '?'}
        stack = ['?']
        for c in s:
            if c in dic: stack.append(c)
            elif dic[stack.pop()] != c: return False 
        return len(stack) == 1

小结

既然要做这件事情,就要付出认真的态度来对待,不要幻想再看一遍,只是自我安慰而已;第一次就要努力做到最好;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值