博客
关于我
AcWing 1070. 括号配对 区间dp
阅读量:560 次
发布时间:2019-03-09

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

为了将给定的BE字符串转换为GBE字符串,我们需要添加最少的字符。GBE的定义类似于正确的括号匹配结构。我们可以使用动态规划来找出最长的GBE子串,然后计算在两侧添加最少的字符数。

方法思路

  • 问题分析:GBE的结构类似于正确的括号匹配。空表达式是GBE,如果两个字符串都是GBE,那么它们的组合也是GBE。我们需要找到最少添加字符使BE字符串成为GBE。

  • 动态规划:使用二维数组dp[i][j]表示子串s[i..j]是否是GBE。通过遍历所有可能的子串长度,检查括号配对情况,更新dp数组。

  • 扩展子串:找到最长的GBE子串,然后计算在两侧添加最少的字符数,使整个字符串成为GBE。

  • 解决代码

    #include 
    using namespace std;
    bool match(char a, char b) {
    return (a == '(' && b == ')') || (a == '[' && b == ']');
    }
    int main() {
    string s;
    cin >> s;
    int n = s.length();
    bool dp[n][n]; // dp[i][j] is true if s[i..j] is GBE
    int len = 0;
    // 初始化所有可能的子串长度
    for (int i = 0; i < n; ++i) {
    dp[i][i] = true; // 单个字符是空表达式,属于 GBE
    }
    for (int len_sub = 2; len_sub <= n; ++len_sub) {
    for (int i = 0; i <= n - len_sub; ++i) {
    int j = i + len_sub - 1;
    if (match(s[i], s[j])) {
    if (j - i == 1) {
    dp[i][j] = true;
    } else {
    dp[i][j] = dp[i+1][j-1];
    }
    } else {
    dp[i][j] = false;
    }
    }
    }
    // 找到最长的 GBE 子串
    int max_len = 0;
    for (int i = 0; i < n; ++i) {
    for (int j = i; j < n; ++j) {
    if (dp[i][j]) {
    max_len = max(max_len, j - i + 1);
    }
    }
    }
    // 扩展到整个字符串
    bool can_be_gbe = dp[0][n-1];
    if (!can_be_gbe) {
    // 找最长的中心对称子串,并计算左右添加的字符数
    int best = 0;
    for (int i = 0; i < n; ++i) {
    for (int j = i; j < n; ++j) {
    if (dp[i][j] && (j - i + 1) > best) {
    best = j - i + 1;
    }
    }
    }
    // 扩展左右
    int add_left = 0, add_right = 0;
    int min_add = INT_MAX;
    for (int i = 0; i < n; ++i) {
    for (int j = i; j < n; ++j) {
    if (dp[i][j]) {
    int l = i, r = j;
    while (l > 0 && match(s[l-1], s[l])) {
    l--;
    }
    while (r < n-1 && match(s[r], s[r+1])) {
    r++;
    }
    int left = l - 0;
    int right = (n-1) - r;
    if (left + right < min_add) {
    min_add = left + right;
    }
    }
    }
    }
    cout << min_add << endl;
    return;
    } else {
    cout << 0 << endl;
    return;
    }
    }

    代码解释

  • 匹配函数match(a, b)检查字符ab是否是括号配对。

  • 动态规划数组初始化dp[i][j]表示子串s[i..j]是否是GBE。单个字符初始化为GBE。

  • 填充动态规划表:对于每个子串长度,检查括号配对情况,更新dp数组。

  • 寻找最长GBE子串:遍历所有子串,找出最长的GBE子串。

  • 扩展子串:如果整个字符串不是GBE,寻找最长的中心对称子串,并计算左右添加字符数的最小值。

  • 通过这种方法,我们可以高效地找到最少需要添加的字符数,使BE字符串转换为GBE字符串。

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

    你可能感兴趣的文章
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx 配置清单(一篇够用)
    查看>>
    Nginx 配置解析:从基础到高级应用指南
    查看>>
    nginx+php的搭建
    查看>>
    nginx+tomcat+memcached
    查看>>
    nginx+Tomcat性能监控
    查看>>
    nginx+uwsgi+django
    查看>>
    Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    Nginx之二:nginx.conf简单配置(参数详解)
    查看>>
    Nginx代理websocket配置(解决websocket异常断开连接tcp连接不断问题)
    查看>>
    Nginx代理初探
    查看>>
    nginx代理地图服务--离线部署地图服务(地图数据篇.4)
    查看>>
    Nginx代理外网映射
    查看>>
    Nginx代理模式下 log-format 获取客户端真实IP
    查看>>
    Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
    查看>>
    Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
    查看>>
    Nginx反向代理与正向代理配置
    查看>>
    Nginx反向代理是什么意思?如何配置Nginx反向代理?
    查看>>
    nginx反向代理解决跨域问题,使本地调试更方便
    查看>>