题解 | #括号区间匹配#

括号区间匹配

https://www.nowcoder.com/practice/e391767d80d942d29e6095a935a5b96b

区间dp

dp[i][j]: 区间[i~j]的字符串匹配所插入的字符数最少为dp[i][j]

区间dp,枚举区间长度来遍历i和j。

初始时,区间长度为1时,dp[i][i]=1。长度不为1时,dp[i][j] = inf

当s[i]和s[j]匹配时,dp[i][j] = dp[i+1][j-1]

然后就是枚举区间[i~j]内的分界点,看区间划分的左右两部分的匹配数

#include <iostream>

#include <string.h>
using namespace std;
const int N = 101, inf = 0x3f3f3f3f;
char str[N];
int dp[N][N];
bool check(int l, int r) {
    if ((str[l] == '[' && str[r] == ']') || (str[l] == '(' && str[r] == ')'))
        return true;
    return false;
}
int main() {
    scanf("%s", str + 1);
    int n = strlen(str + 1);
    for (int d = 1; d <= n; d++) {
        for (int l = 1; l + d - 1 <= n; l++) {
            int r = l + d - 1;
            if (d == 1) dp[l][r] = 1; //仅有一个字符时,那最少插入1个字符才匹配
            else {
                dp[l][r] = inf;  
                if (check(l, r))
                    dp[l][r] = min(dp[l][r], dp[l + 1][r - 1]);
                //s[l]与s[r]匹配不匹配都要枚举中间的,比如"[]([]" 明显dp[1][5]=1,如果来自于dp[2][4]("](["-明显是3)就不对了
                for (int k = l; k <= r; k++) {
                    dp[l][r] = min(dp[l][r], dp[l][k] + dp[k + 1][r]);
                }
            }
            
        }
    }
    printf("%d", dp[1][n]);
    return 0;
}
// 64 位输出请用 printf("%lld")
#每日一题#
全部评论

相关推荐

07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
点赞 评论 收藏
分享
05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务