文章

4

粉丝

0

获赞

1

访问

98

头像
最长的括号匹配 题解:
P5227 中国科学技术大学2024年机试题
发布于2026年2月26日 15:11
阅读数 20

#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>
#include <stack>

using namespace std;

int main(void) {
    /*
    只统计有效的括号
    1. ()()()
        如何统计, 如果我们栈记录左括号的下标, 那么每有一个右括号我们应该弹出一个,
        并且更新长度, 如何更新长度呢?在栈初始化一个 【虚空】位置, 表明这个位置之后的才可能是合法位置
        这样,每次弹出, 都以这个为界限 即 [st.top() + 1, i] 为合法区间
    2. ))()
        一开始的右括号全是违规的, 那么按上述处理, 当栈内元素个数为1时, 表明无合法序列
        那么我们更新最近的违规距离, 标记 st.top() + 1可能是合法开始即可
    */
    string s;
    cin >> s;
    int n = s.size();
    
    stack<int> st; // 记录下标
    st.push(-1);
    int ans = 0;
    for (int i = 0; i < n; i++) {
        if (s[i] == '(') {
            st.push(i);
        }
        else {
            if (st.size() > 1) {
                // 有合法区间, 则 计算最大长度
                st.pop();
                ans = max(ans, i - st.top()); // [st.top() + 1, i] 为合法区间
            }
            else {
                s...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发