题目描述
给定一个由 ‘(’ 和 ‘)’ 括号组成的字符串 S,我们需要添加最少的括号( ‘(’ 或是
‘)’,可以在任何位置),以使得到的括号字符串有效。 从形式上讲,只有满足下面几点之一,括号字符串才是有效的: 它是一个空字符串,或者
它可以被写成 AB (A 与 B 连接), 其中 A 和 B 都是有效字符串,或者 它可以被写作 (A),其中 A 是有效字符串。
给定一个括号字符串,返回为使结果字符串有效而必须添加的最少括号数。
解题思路
这一题比较简单,直接借用栈就可以解决,也就是让字符串中的字符和栈内元素匹配,如果字符串第一个或者某一个字符是“(”,那么就直接入栈,如果是")”,那么将要判断此时栈顶元素,如果栈顶元素是"(",那么可以匹配,就出栈,遍历下一个字符…
代码
int minAddToMakeValid(string s){
stack<char> s1;
if(s==""){
return 0;
}
int len=0;
while(len<s.length()){
if(s[len]=='('){
s1.push(s[len])
}
else if(s[len]==')'){
if(s1.empty() ||s1.top==')'){
s1.push(s[len]);
}
else{
s1.pop();
}
}
len++;
}
return s1.size();
}
完整代码
//借助一个新栈,然后遍历当前字符串,如果当前栈顶元素和目前字符括号匹配,则弹出栈顶元素,
//否则进行入栈操作,最后需要的括号数即为栈剩余的元素个数
#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
class Solution{
public:
int minAddToMakeValid(string s){
if(s==""){
return 0;
}
stack<char> s1;
int len=0;
while(len<s.length()){
if(s[len]=='('){
s1.push(s[len]);
}else if(s[len]==')'){
if(s1.empty() || s1.top()==')'){
s1.push(s[len]);
}else{
s1.pop();
}
}
len++;
}
return s1.size();
}
};
int main(){
string s;
cin>>s;
int num;
num=Solution().minAddToMakeValid(s);
cout<<num<<endl;
return 0;
}