列表

详情


NC21303. 删括号

描述

给你一个合法的括号序列s1,每次你可以删除一个"()"
你可以删除0个或者多个"()"
求能否删成另一个括号序列s2

输入描述

第一行输入一个字符串s (2 ≤ |s| ≤ 100)
第二行输入一个字符串t (2 ≤ |t| ≤ 100 )

输出描述

如果可以输出"Possible"
否则输出"Impossible"

示例1

输入:

(())
()

输出:

Possible

示例2

输入:

()
()

输出:

Possible

示例3

输入:

(()()())
((()))

输出:

Impossible

示例4

输入:

((())((())())())
(()(())())

输出:

Possible

示例5

输入:

((())((())())())
((()()()()()))

输出:

Impossible

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 1152K, 提交时间: 2019-02-02 11:42:00

#include<cstdio>
#include<cstring>
const int N=105;
int n,m,i,j,k;char a[N],b[N];bool f[N][N][N];
int main(){
  scanf("%s%s",a+1,b+1);
  n=strlen(a+1),m=strlen(b+1);
  f[0][0][0]=1;
  for(i=0;i<n;i++)for(j=0;j<=m;j++)for(k=0;k<=n;k++)if(f[i][j][k]){
    if(!k&&a[i+1]==b[j+1])f[i+1][j+1][k]=1;
    if(a[i+1]=='(')f[i+1][j][k+1]=1;
    else if(k)f[i+1][j][k-1]=1;
  }
  puts(f[n][m][0]?"Possible":"Impossible");
}

上一题