LC-678. 有效的括号字符串

678. 有效的括号字符串

给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:

任何左括号 ( 必须有相应的右括号 )。
任何右括号 ) 必须有相应的左括号 ( 。
左括号 ( 必须在对应的右括号之前 )。

  • 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
    一个空字符串也被视为有效字符串。
    示例 1:

输入: "()"
输出: True
示例 2:

输入: "(*)"
输出: True

解析:

对于右括号我们一边扫描,vector去维护'(','*',总是去匹配最靠近它的左括号,如果没有就去匹配 * 号,一边完成后,左括号是完全符合规范的, vector里面顺序存储了 ( * , 这时就需要去判断这剩下的匹配是否正确,倒序的遍历一遍就可以了.

class Solution {
public:
    bool checkValidString(string s) {
        int len = s.size();
        int totil = 0;
        vector<char> ans;
        for (int i = 0; i < len; i++) {
            if (s[i] == '*' || s[i] == '(') {
                ans.push_back(s[i]);
                if (s[i] == '*') {
                    totil++;
                }
            }else {
                bool falg = 0;
                if (ans.size() <= 0 ) return false;
                for (int i = ans.size() - 1; i >= 0; i--) {
                    if (ans[i] == '(') {
                        falg = 1;
                        ans.erase(ans.begin() + i);
                        break;
                    }
                }
                if (!falg) {
                    totil--;
                    ans.pop_back();
                }
            }
            
        }
        totil = 0;
        for (int i = ans.size() - 1; i >= 0; i--) {
            
            if (ans[i] == '(') {
                totil--;
            }else {
                totil++;
            }
            if (totil < 0) return false;
        }
         return true;
    }
};
posted @ 2021-09-16 09:10  慢慢呀  阅读(131)  评论(0)    收藏  举报