2025-7-29
2025-7-29
codeforces-edu62-B
题意描述
给定一个由__<和>__组成的括号串,求进行最少任意删除操作变成好串。
定义好串: 删除__>后面的字符,或者'<'__前面的字符,可以变成一个字符
解题思路
找左边第一个>左边的元素删除,或者右边第一个<右边的元素全部删除
解题代码(仅solve函数)
void solve()
{
int n; read(n);
string str; read(str);
if(n == 1){
print(0);
return;
}
int i = 0, j = n - 1;
while(i < n && str[i] == '<')i++;
while(j >= 0 && str[j] == '>')j--;
int ans = min(i, n - 1 - j);
print(ans);
}
acwing-暑假每日一题-6447-最长括号匹配
题意分析
给定括号串,找出最长有效(格式正确且连续)括号子串的长度。
解题思路
- 栈法
-
用栈维护未匹配的括号位置,核心思想是:
-
遇到
'(':下标入栈 -
遇到
')':尝试弹出栈顶- 如果栈非空:更新最大长度为
i - 栈顶下标 - 如果栈为空:说明不匹配,记录当前位置作为新的“起点”
- 如果栈非空:更新最大长度为
-
- 双向遍历计数
- 分别从左到右和从右到左遍历字符串:
- 正向遍历:遇
(加一,遇)减一;当左右括号数量相等时,更新最大长度;若右括号多,清空计数 - 反向遍历:对称处理,解决正向遍历遗漏的部分(如多余的
()
- 正向遍历:遇
解题代码
1.栈法
void solve(){
string s; read(s);
stack<int> stk;
stk.push(-1); //-1维护0-i的合法串
int maxlen = 0;
for(int i = 0; i < lth(s); i++){
if(s[i] == '('){
stk.push(i);
}
else{
stk.pop();
if(stk.empty()){
stk.push(i);
}
else maxlen = max(maxlen, i - stk.top());
}
}
print(maxlen);
}
2.双向计数
void solve()
{
string s; read(s);
int left = 0, right = 0, maxlen = 0;
for (char c : s) {
if (c == '(') ++left;
else ++right;
if (left == right) maxlen = std::max(maxlen, 2 * right);
else if (right > left) left = right = 0;
}
left = right = 0;
for (int i = s.size() - 1; i >= 0; --i) {
if (s[i] == '(') ++left;
else ++right;
if (left == right) maxlen = std::max(maxlen, 2 * left);
else if (left > right) left = right = 0;
}
print(maxlen);
}
- 时间复杂度o(n)

浙公网安备 33010602011771号