输入包括一行,一个括号序列s,序列长度length(1 ≤ length ≤ 50). s中每个字符都是左括号或者右括号,即‘(‘或者‘)‘.
输出一个整数,表示最少需要添加的括号数
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; } //第一次未通过的测试样例: //)(())((((()()())))(()(())((()(()(((())(()(((((()))
原文:https://www.cnblogs.com/cstdio1/p/11012836.html