该题与前面做过的题很相似有效的括号(栈)_ZZZWWWFFF_的博客-CSDN博客
对了该题题目看起来有些复杂,我仔细读了一遍发现这不就是“求没匹配上的括号有多少个”吗??
思路:我们遇到左括号就入栈,遇到右括号便与栈顶的元素匹配(注意此时要判断是否栈空),否则就继续入栈
class Solution {
public://求没匹配上的括号有多少个
char getleft(char r)
{
return '(';
}
int minAddToMakeValid(string s) {
stack<char>st;
int len=s.length();
for(int i=0;i<len;i++)
{
if(s[i]=='(')
{
st.push(s[i]);
}
else
{
if(!st.empty()&&getleft(s[i])==st.top())
{
st.pop();
}
else
{
st.push(s[i]);
}
}
}
return st.size();
}
};
实际上,在遇到这类括号问题的时候我们通常会选择使用“平衡法”,即通过左括号的数量和右括号的数量的比较得到答案
思路:我们一边遍历字符串一边统计左括号的数量和右括号的数量,如果有一个时候左括号的数量和右括号的数量不等,我们便叠加它们的差值(该值实际上便是我们需要补上的括号数),注意我们这个时候假装补齐了所需括号需要更新统计的括号的数量,最后返回时也需再判断一次是否完全匹配
class Solution {
public:
int minAddToMakeValid(string s) {
int left = 0, right = 0, ans = 0; // left 为左括号数, right 为右括号数
for (const char c : s) {
c == '(' ? ++left : ++right;
// 到目前位置,右括号已经比左括号数多,则必须再这之前,补齐左括号,
// 才能保证括号都是有效的
if (right > left) {
ans += right - left;
left = right; // 补齐左括号后,更新左括号数
}
}
return ans + left - right; // 判断过程中添加的左括号,再加上左括号比右括号多的数
}
};