输入:一个字符串 s,它由三种字符组成:'(',')' 和小写英文字母
要求:需要从字符串 s 中删除最少数目的 '(' 或 ')' 括号,使得最终得到的字符串是一个“有效”的括号字符串。
输出:返回任意一个符合要求的、最终有效的字符串。
思路:首先,除去左右括号的字符都是干扰,无需在意;然后,开始匹配括号。
- 栈空 然后有左括号要入栈 直接入栈 没什么问题
- 栈空 然后有右括号要入栈 这个要直接剔除 无论如何都满足不了
- 栈不空 里面肯定是左括号 有右括号要入栈 匹配成功 直接出栈一个左括号
- 栈不空 里面肯定是左括号 有左括号要入栈 依旧是直接进栈
- 匹配结束后 依旧留在栈里的 没救了 也要被放弃
- 这样 排除了无法得到的满足的左右括号 能匹配成功的括号都匹配成功 确保是删除最少数目
复杂度:
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public:
string minRemoveToMakeValid(string s) {
stack<int> tmp;
priority_queue<int, std::vector<int>, std::greater<int>> deltmp;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') {
tmp.push(i); //待确认要不要删除的括号序号
}
else if (tmp.empty() && s[i] == ')') {
deltmp.push(i);//已确认要删除的括号序号
}
else if (!tmp.empty() && s[i] == ')') {
tmp.pop();
}
}
while (!tmp.empty()) {
deltmp.push(tmp.top());
tmp.pop();
}
string ans;
for (int i = 0; i < s.size(); i++) {
// 注意得检查deltmp空不空
if (!deltmp.empty() && i == deltmp.top()) {
deltmp.pop();
}
else {
ans += s[i];
}
}
return ans;
}
};
移除无效括号的最优解法
3620

被折叠的 条评论
为什么被折叠?



