LeetCode 2116. Check if a Parentheses String Can Be Valid

26 阅读1分钟

🔗 leetcode.com/problems/ch…

题目

  • 给一个字符串,由'(' and ')' 组成
  • 给一个数组,和字符串长度一致
  • 若对应 index 为 0 表示,括号可以变换为 '(' or ')'
  • 若对应 index 为 1 表示,表示当前字符不可动
  • 判断经过变动,字符串是否可以是一个 valid 的括号对

思路

  • 若字符串的长度为 odd,则不可能为 valid 的

  • 遍历字符串的过程中,用两个 stack 进行记录

    • 一个是所有 unlock 的 index,这些可以自由组合自由变化
    • 一个是 lock 的 (
    • 对于 lock 的 ) , 优先和 lock 的 ( 配对,再和 unlock 中的 top 配对
  • 遍历结束后,lock 的 ( 和 unlock 的元素进行搭配,判断其 index 是否满足需求,若可以配对完 lock stack 中的元素,则表明是一个 valid 的字符串,否则不是

代码

class Solution {
public:
    bool canBeValid(string s, string locked) {
        if (s.size() & 1) return false;
        stack<int> st_lock;
        stack<int> unlock;
        for (int i = 0; i < s.size(); i++) {
            if (locked[i] == '0') {
                unlock.push(i);
                continue;
            }
            if (s[i] == '(') {
                st_lock.push(i);
            }
            if (s[i] == ')') {
                if (st_lock.empty() && unlock.empty()) return false;
                if (st_lock.empty() == false) st_lock.pop();
                else unlock.pop();
            }
        }
        while (!st_lock.empty()) {
            if (unlock.empty()) return false;
            if (st_lock.top() < unlock.top()) {
                st_lock.pop();
                unlock.pop();
                continue;
            }
            return false;
        }
        return true;
    }
};