LeetCode678.有效的括号字符串

题目链接: 点这里
思路: 使用栈匹配法
分析: 从左向右遍历, 如果碰到左括号, 放入左括号栈, 如果碰到星号, 那么放入星号栈, 由于星号可以是左括号, 右括号, 和空字符, 那么我们在碰到右括号时, 优先匹配左括号, 当左括号没有时, 那么可以匹配星号, 这里有个问题, 即如果星号是左括号, 那么其匹配的右括号应该为第一个, 而不是左括号用完后的哪一个右括号, 这里如果我们将星号看成左括号, 那么相当于我们调换了两个左括号的位置, 并不会影响结果, 所以可以使用这个方法

class Solution {
public:

    bool checkValidString(string s) {
        stack<int> left;
        stack<int> start;
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == '(')  {
                left.push(i);
            } else if (s[i] == '*') {
                start.push(i);
            } else {
                if (!left.empty()) {left.pop(); continue;}; // 如果有左括号, 那么可以优先匹配左括号
                if (!start.empty()) {start.pop(); continue;}; // 如果没有左括号, 那么可以匹配星号
                return false; // 否则返回false
            }
        }
        while (!left.empty() && !start.empty()) {
            int left_index = left.top(); left.pop();
            int start_index = start.top(); start.pop();
            if (left_index > start_index) return false; // 如果星号在左括号的右边, 那么就可以匹配
        }
        return left.empty() ? true : false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值