题解 | #最小代价使括号有效#

最小代价使括号有效

https://www.nowcoder.com/practice/ba0ca620957f404cb1c2ea79d9f396ee

#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return string字符串
     */
    string minRemoveToMakeValid(string s) {
        // write code here
        this->s = s;
        dfs(0);
        string ret = "";
        for (auto ch : ans) ret += ch;
        return ret;
    }

    void dfs(int i) {
        // 到达结尾
        if (i >= s.size()) {
            if (stk.size() > 0) return; // 栈不空,是非法串
            if (path.size() > ans.size()) {
                ans.clear();
                for (auto ch : path) ans.push_back(ch);
            }
            return;
        }
        // 不是括号
        if (!isBrace(s[i])) {
            path.push_back(s[i]);
            dfs(i + 1);
            path.pop_back();
            return;
        }

        // 研究左括号
        if (isLeftBrace(s[i])) {
            // 不删除 s[i],入栈 & 回溯
            stk.push_back(s[i]);
            path.push_back(s[i]);
            dfs(i + 1);
            path.pop_back();
            stk.pop_back();
            // 删除 s[i]
            dfs(i + 1);
            return;
        }

        // 研究右括号
        if (stk.empty()) { // 没有左括号与之匹配
            // 删除 s[i] 
            dfs(i + 1); 
        } else if (isMatch(stk.back(), s[i])) { // 匹配
            // 出栈 & 回溯
            char tmp = stk.back();
            stk.pop_back();
            path.push_back(s[i]);
            dfs(i + 1);
            path.pop_back();
            stk.push_back(tmp);
        } else { // 不匹配
            // 删除 s[i] 
            dfs(i + 1); 
        }
    }

    bool isLeftBrace(char ch) {
        return ch == '(' ||
               ch == '[' ||
               ch == '{' ;
    }

    bool isRightBrace(char ch) {
        return  ch == ')' ||
                ch == ']' ||
                ch == '}' ;
    }

    bool isBrace(char ch) {
        return isLeftBrace(ch) || isRightBrace(ch);
    }

    bool isMatch(char l, char r) {
        return l == '(' && r == ')' ||
               l == '[' && r == ']' ||
               l == '{' && r == '}' ;
    }

    vector<char> stk = vector<char>();
    string s;
    vector<char> ans = vector<char>();
    vector<char> path = vector<char>();

};

回溯

全部评论

相关推荐

牛客840099999号:没见过这样的大厂,至少头部的肯定没有
点赞 评论 收藏
分享
小狗吃臭臭:差不多也就这样了,估计再多写也就是造假了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务