[LeetCode]678. 有效的括号字符串

括号匹配

Posted by JinFei on September 13, 2021

题目描述

给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 )。 任何右括号 ) 必须有相应的左括号 ( 。 左括号 ( 必须在对应的右括号之前 )。 * 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。 一个空字符串也被视为有效字符串。

Example 1:

输入: “()” 输出: True

Example 2:

输入: “(*)” 输出: True

Example 3:

输入: “(*))” 输出: True

Constraints:

  • 字符串大小将在 [1,100] 范围内。

解题思路

  • 括号匹配,可采用栈来进行模拟
  • 这道题主要有特殊字符,’*‘来表示任意
  • 此题需要两个栈,一个是左括号栈,一个是*栈
  • 遍历整个字符串,如果是’(‘,左括号入栈
  • 如果是’‘,入号栈
  • 否则,如果是’)’,查看是否有左括号,如果有,就弹出,查看是否有’*‘,如果有就弹出
  • 否则,就直接返回false
  • 遍历完最后,可能会出现两个栈不为空的情况,那么需要将栈看作‘)’栈,先观察一下下标,如果左括号的下标大于号的下标,就直接返回false

C++代码

class Solution {
public:
    bool checkValidString(string s) {
        if(s.size() == 0){
            return true;
        }
        stack<char> lefts;
        stack<char> alias;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == '('){
                lefts.push(i);
            }else if(s[i] == '*'){
                alias.push(i);
            }else{
                if(!lefts.empty()){
                    lefts.pop();
                }else if(!alias.empty()){
                    alias.pop();
                }else{
                    return false;
                }
            }
        }
        while(!lefts.empty() && !alias.empty()){
            int leftIndex = lefts.top();
            lefts.pop();
            int aliasIndex = alias.top();
            alias.pop();
            if(leftIndex > aliasIndex){
                return false;
            }
        }
        return lefts.empty();
    }
};