题目:
给你一个由 '('、')' 和小写字母组成的字符串 s。
你需要从字符串中删除最少数目的 '(' 或者 ')' (可以删除任意位置的括号),使得剩下的「括号字符串」有效。
请返回任意一个合法字符串。
有效「括号字符串」应当符合以下 任意一条 要求:
- 空字符串或只包含小写字母的字符串
- 可以被写作 AB(A 连接 B)的字符串,其中 A 和 B 都是有效「括号字符串」
- 可以被写作 (A) 的字符串,其中 A 是一个有效的「括号字符串」
示例:
输入:s = "lee(t(c)o)de)"
输出:"lee(t(c)o)de"
解释:"lee(t(co)de)" , "lee(t(c)ode)" 也是一个可行答案。
- 1 <= s.length <= 10^5
- s[i] 可能是 '('、')' 或英文小写字母
解题方法:
- 创建一个stack,用来存储'('在字符串s中的下标;
- 遍历字符串s,如果是'(',stack中记录下标;如果是')',需要判断stack内是否有'(',如果stack是空的,说明这个')'是多余的,把s中对应位置设置城'*',反之说明还有'('可以与之匹配,则弹出stack顶端的元素。
- 完成s的遍历以后,还要判断stack是不是空的,因为'('也可能有多余的,将stack中存储的下标取出,将s对应位置设置成'*'。
- 遍历s,将非'*'元素存进新的字符串中。
代码和结果:
class Solution {
public:
string minRemoveToMakeValid(string s) {
string srev;
stack<int> idx;
for(int i=0;i<s.size();i++)
{
if(s[i]=='(')
{
idx.push(i);
}
else if(s[i]==')')
{
if(idx.empty())
s[i]='*';
else
idx.pop();
}
}
while(!idx.empty())
{
s[idx.top()]='*';
idx.pop();
}
for(int i=0;i<s.size();i++)
{
if(s[i]!='*')
srev.push_back(s[i]);
}
return srev;
}
};
运行结果:原题链接:https://leetcode-cn.com/problems/minimum-remove-to-make-valid-parentheses/