一下课就发现题目做错了……虽然测试样例过了……
'][' 这种情况下好像有问题。解决办法很简单,每次判断一下l是否大于r,如果是,则跳出就行。
题目描述
给定一个非空序列s,里面只包含'[' 或 ']'。请计算出该序列中最长的连续合法的括号子序列
举个例子:
s=][[]][]]
在这其中,连续合法的括号子序列是"[[]][]",于是结果应是6
输入:
一个字符串
输出:
一个整数,最长有效括号子串的长度
样例输入输出
样例1
输入:
][[]][]]
输出:
6
#include<iostream>
#include<deque>
#include<set>
using namespace std;
/** 样例1
* 输入:
* ][[]][]]
* 输出:
* 6
* */
struct m_greater {
template<class T>
bool operator()(const T& left, const T& right) const {
return left > right;
}
};
int main()
{
string s;
cin >> s;
deque<char> d; // deque容器两头都可以操作,方便很多
for(char c:s) // 将字符串拆成单个
d.push_back(c);
set<int, m_greater> st; // 自定义一个比较模板,将set中的数据按从大到小排,输出第一个即可,在这里存放每次遍历得到的最大值
int maxs = 0;
while (!d.empty()) // 开始从后向前比较,如果有一个‘[‘则l++,’]‘则r++,l和r相等的时候,说明可以闭合,把它赋值给maxs
{
int l = 0, r = 0;
for (auto it = d.rbegin(); it != d.rend(); ++it) // 逆向遍历
{
if (*it == '[')
l++;
else
r++;
if (l == r)
maxs = l;
}
d.pop_back(); // 删除最后一个元素
st.insert(maxs);
maxs = 0;
}
cout << *st.begin() * 2; // 记录的是一对的量,故要乘2
}