博客
关于我
51Nod 1791 合法括号子段
阅读量:413 次
发布时间:2019-03-06

本文共 1553 字,大约阅读时间需要 5 分钟。

给定一串括号串,对于其中每个左括号‘(’最多只能找到一个与之相匹配的右括号‘)’。我们可以用栈算法找出每个括号的匹配位置,存储在数组pos中。pos[i]表示第i个左括号对应的右括号的位置,初始值为-1,表示没有匹配的右括号。接下来,我们需要计算以每个括号为开头的合法括号序列的数量,存储在ans数组中。

状态转移方程为ans[i] = ans[pos[i] + 1] + 1,其中i != -1。ans[i]表示以第i个括号开头的合法括号序列的数量。最终答案是所有ans[i]的总和。

解题步骤

  • 初始化:创建pos数组,初始值均为-1。创建ans数组,初始值均为0。

  • 栈匹配括号:使用栈遍历括号字符串,记录每个左括号对应的右括号位置到pos数组中。

  • 计算ans数组:从字符串末尾向前遍历,根据pos数组更新ans数组的值。

  • 求总和:将ans数组中的所有值求和,得到最终答案。

  • 代码实现

    #include 
    #include
    using namespace std;
    int main() {
    char s[n];
    int t;
    stack
    S;
    for (scanf("%d", &t); t--; ) {
    scanf("%s", s);
    int len = strlen(s);
    fill(pos, pos + len, -1);
    fill(ans, ans + len, 0);
    while (!S.empty()) {
    int i = S.top();
    S.pop();
    if (s[i] == ')') {
    for (int j = 0; j < len; ++j) {
    if (s[j] == '(' && pos[j] == -1) {
    pos[j] = i;
    break;
    }
    }
    }
    }
    int sum = 0;
    for (int i = len - 1; i >= 0; --i) {
    if (pos[i] != -1) {
    ans[i] = ans[pos[i] + 1] + 1;
    sum += ans[i];
    }
    }
    cout << sum << '\n';
    }
    return 0;
    }

    代码解释

  • 初始化:使用fill函数初始化pos和ans数组,pos初始值为-1,ans初始值为0。

  • 栈匹配括号:遍历字符串,使用栈记录左括号的位置。当遇到右括号时,弹出栈顶的左括号位置,并将其记录到pos数组中。

  • 计算ans数组:从字符串末尾向前遍历,计算每个左括号对应的合法括号序列数量。ans[i] = ans[pos[i] + 1] + 1,表示以i为起点的括号序列数等于其后续可能的括号数加上空的情况。

  • 求总和:将ans数组中的所有值求和,得到最终答案,并输出。

  • 通过这种方法,可以高效地计算出每个左括号开头的合法括号序列数量,并求出总和,解决问题。

    转载地址:http://rkokz.baihongyu.com/

    你可能感兴趣的文章
    nginx 后端获取真实ip
    查看>>
    Nginx 多端口配置和访问异常问题的排查与优化
    查看>>
    Nginx 如何代理转发传递真实 ip 地址?
    查看>>
    Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    Nginx 学习(一):Nginx 下载和启动
    查看>>
    nginx 常用指令配置总结
    查看>>
    Nginx 常用配置清单
    查看>>
    nginx 常用配置记录
    查看>>
    nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>
    Nginx 结合 consul 实现动态负载均衡
    查看>>
    Nginx 负载均衡与权重配置解析
    查看>>
    Nginx 负载均衡详解
    查看>>
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置https(一)—— 自签名证书
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx 配置清单(一篇够用)
    查看>>