给你一个由 ‘(’、’)’ 和小写字母组成的字符串 s。
你需要从字符串中删除最少数目的 ‘(’ 或者 ‘)’ (可以删除任意位置的括号),使得剩下的「括号字符串」有效。
请返回任意一个合法字符串。
有效「括号字符串」应当符合以下 任意一条 要求:
空字符串或只包含小写字母的字符串
可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」
可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」
示例 1:
输入:s = “lee(t©o)de)”
输出:“lee(t©o)de”
解释:“lee(t(co)de)” , “lee(t©ode)” 也是一个可行答案。
示例 2:
输入:s = “a)b©d”
输出:“ab©d”
示例 3:
输入:s = “))((”
输出:""
解释:空字符串也是有效的
示例 4:
输入:s = “(a(b©d)”
输出:“a(b©d)”
提示:
1 <= s.length <= 10^5
s[i] 可能是 ‘(’、’)’ 或英文小写字母
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-remove-to-make-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————————
解题思路:使用栈,将左括号的索引放进栈中,遇到一个右括号,如果栈不为空,则放出一个左括号的索引。如果堆栈为空,则将该右括号抛弃;
class Solution {
public:
string minRemoveToMakeValid(string s) {
vector<int> pos(s.size(),1); # 用一个大小为字符串s大小的容器存储状态变量,全部值初始化为1;
stack<int> st; # 建议一个堆栈,将括号的索引压进去
for(int i=0;i<s.size();++i) # 循环字符串中的每一个字符
{
if(s[i]=='(') # 如果该括号是左括号
{
st.push(i); # 将该括号的索引压进堆栈中
}
else if(s[i]==')') # 如果该括号是右括号
{
if(st.empty()) # 如果此时堆栈为空,表示没有左括号可以和该右括号对应,将vector中对应索引的值标记为0
pos[i]=0;
else # 如果堆栈不为空,则抛出一个左括号的索引
st.pop();
}
}
while(!st.empty()) #循环后如果堆栈不为空,表示堆栈中的左括号都是没有对应右括号的多余括号,将vector中其索引对应的值变为0
{
pos[st.top()]=0;
st.pop();
}
string res; # 建立一个字符串变量
for(int i=0;i<s.size();++i) # 循环容器vector中的每个值
{
if(pos[i]) # 如果vector中的值不为零,则将其放进字符串变量中
res+=s[i];
}
return res;
}
};