题解 | #最小代价使括号有效#
最小代价使括号有效
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>(); };
回溯