题目描述
一个完整的括号字符串定义规则如下:
1、空字符串是完整的。
2、如果s是完整的字符串,那么(s)也是完整的。
3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。
例如,"(()())", ""和"(())()"是完整的括号字符串,"())(", "()(" 和 ")"是不完整的括号字符串。
牛牛有一个括号字符串s,现在需要在其中任意位置尽量少地添加括号,将其转化为一个完整的括号字符串。请问牛牛至少需要添加多少个括号。
1、空字符串是完整的。
2、如果s是完整的字符串,那么(s)也是完整的。
3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。
例如,"(()())", ""和"(())()"是完整的括号字符串,"())(", "()(" 和 ")"是不完整的括号字符串。
牛牛有一个括号字符串s,现在需要在其中任意位置尽量少地添加括号,将其转化为一个完整的括号字符串。请问牛牛至少需要添加多少个括号。
输入描述:
输入包括一行,一个括号序列s,序列长度length(1 ≤ length ≤ 50). s中每个字符都是左括号或者右括号,即'('或者')'.
输出描述:
输出一个整数,表示最少需要添加的括号数
示例1
输出
复制2
最初解题思想:保证左括号和右括号数目相同就可以,遇到左括号cnt++,遇到右括号cnt--,输出结果为左右括号的绝对值,通过率为60%
没有通过的样例:)(())((((()()())))(()(())((()(()(((())(()(((((())),)(
思想的bug:第一个如果是)第二个是(也就意味着绝对值等于0
进一步解题思想:加一个计数cnt<0的标志cnt_zero,当cnt<0,cnt_zero++,(就是即使左右括号数相等也要加上的括号)并且将cnt置为0重新计算还要匹配的括号数。
完整代码如下:
#include <iostream> #include <cmath> //我好像是一个在海边玩耍的孩子, //不时为拾到比通常更光滑的石子或更美丽的贝壳而欢欣鼓舞, //而展现在我面前的是完全未探明的真理之海. using namespace std; int main() { string str; int cnt=0,cnt_zero=0; getline(cin,str); for(int i=0;i<str.size();i++){ if(str[i]=='(')cnt++; if(str[i]==')')cnt--; if(cnt<0){cnt_zero++;cnt=0;} } //cout<<abs(cnt)<<endl; cout<<cnt+cnt_zero<<endl; //cout<<cnt<<endl; //cout << "Hello world!" << endl; return 0; } //第一次未通过的测试样例: //)(())((((()()())))(()(())((()(()(((())(()(((((()))