Level1
最长合法括号子序列的长度(序列不要求连续性)
思路一:每当有括号匹配就加入答案
每当右括号的数量大于左括号的数量的时候,就说明加上当前的右括号就是不合法的了。这时候就把匹配到的括号数量(左括号数量*2)加到答案上去,在把左括号和右括号的数量置为0。注意最后可能会出现((()这种情况,虽然右括号数量小于左括号数量,但仍有合法的括号,所以在循环结束之后需要判断。
注意不能匹配左括号的数量等于有括号的数量,例如 )(,它也会认为是正确的答案,即不合法的括号也会匹配到
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
string s; cin >>s;
int l = 0, r = 0, res = 0;
for(int i = 0; i < s.length(); i ++ )
{
if(s[i] == '(') l ++ ;
else r ++ ;
if(r > l)//r>=l
{
res += l * 2;
r = l = 0;
}
}
if(l && r) res += r * 2;
cout << res << endl;
return 0;
}
思路二: 计算合法括号的个数,最后加入答案
主要思路就是如果输入一个上括号就把数量存下来,等下括号匹配;
如果输入下括号则也存储下来标志着与前面某一个上括号匹配;
如果下括号数量大于上括号则多余的下括号不能匹配,把多余的下括号给排除掉(b=a);
最后把下括号数量也就是匹配数量*2后输出即可显然这种方法更简洁,方便
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
string s; cin >>s;
int l = 0, r = 0, res = 0;
for(int i = 0; i < s.length(); i ++ )
{
if(s[i] == '(') l ++ ;
else r ++ ;
if(r >= l)
{
res += l * 2;
r = l = 0;
}
}
if(l && r) res += r * 2;
cout << res << endl;
return 0;
}