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. 双向遍历计数
  • 分别从左到右和从右到左遍历字符串:
    • 正向遍历:遇 ( 加一,遇 ) 减一;当左右括号数量相等时,更新最大长度;若右括号多,清空计数
    • 反向遍历:对称处理,解决正向遍历遗漏的部分(如多余的 (

解题代码

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)
posted @ 2025-08-07 20:45  kodil  阅读(10)  评论(0)    收藏  举报