题目描述
如果一个字符串中的括号是成对出现的且闭合顺序无误则称该字符串为标准字符串。给你一个字符串,该字符串由左括号右括号和英文字母组合而成,请你移除最少数目的括号,使得它成为一个标准字符串,并返回修改之后的标准字符串。
注意:修改后的标准字符串可能不唯一,你可以输出任何正确的一个结果。
思路分析
这种字符串中括号配对的问题很多时候都可以使用栈数据结构来解决。下面给出使用栈来解决该题的思路:
- 定义两个栈,分别用来存储括号字符和字符在原字符串中的索引,它们同步进栈和出栈。
- 遍历原字符串,当遍历到左括号时,将其和它的索引压入上面的两个栈中;当遍历到右括号时,根据栈顶的元素确定是从栈中弹出还是压入。
- 遍历完之后,用来存储索引的栈中存放的是需要被移除的括号在原数组中的索引,对其进行移除即可。
AC代码(C++)
class Solution {
public:
/**
*
* @param s string字符串
* @return string字符串
*/
string minRemove(string s) {
// write code here
string sNew = "";
stack<int> hw; // 用来存储多余的括号
stack<char> hh; // 用来存储多余括号在原字符串中的索引
int A[1000] = {0}; // 用来转存多余括号在原字符串中的索引
for(int i = 0; i < s.length(); i ++)
{
if(s[i] == '(')
{
hw.push(i);
hh.push('(');
}
else if(s[i] == ')')
{
if(hw.empty() || hh.top() == ')')
{
hw.push(i);
hh.push(')');
}
else
{
hw.pop();
hh.pop();
}
}
}
int count = 0;
while(!hw.empty())
{
A[count++] = hw.top();
hw.pop();
}
for(int i = 0; i < s.length(); i ++)
{
int flag = 0;
for(int j = 0; j < count; j ++)
{
if(i == A[j])
{
flag = 1;
}
}
if(flag == 0)
{
sNew += s[i];
}
}
return sNew;
}
};
类似题目
- 借用上述标准字符串的概念,写一个函数用来判断输入字符串是否为标准字符串。这个题目比较简单,只需要一个栈结构,采取相同的策略进栈出栈,最后判断栈是否为空即可。
- 求将一个字符串变为标准字符串需要移除的最少括号的数目,这个只需要返回上述栈中元素的数目即可。