牛客 删括号

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
删括号

思路:
在思考这题时发现此题和编辑距离题目十分相似。
编辑距离
对于本题题目的状态设置看完题解后感觉十分巧妙,在原有二维基础上加了个记录删除’(‘括号数来进行状态转移。
状态设置:布尔类型(bool)f(i,j,k)表示s串删除进行删除操作后,可以与t串匹配,删除的左括号与右括号之差为k。
也就说明当k为0时删除的是合法序列。
那么状态如何转移呢:
不难发现在dp[i][j][k]合法的情况下,如果此时 s[i]=t[i]且k=0 那么说明dp[i+1][j+1][0] 也是合法的。
而后对于s串往后加了一个字符串讨论,如果加了一个’('情况下,那么在删除一个’(‘后依旧可以和t串匹配即 dp[i+1][j][k+1]=true 如果为’)'则需要删除此字符串才能与t串匹配这时需要寻找dp[i][j][k>0]情况下是否有合法的,然后进行状态转移,即dp[i][j][k-1]=true。

#include<iostream>
#include<algorithm>
#include<string>
#include <string.h>
using namespace std;

const int N = 110;

char s[N], t[N];

bool f[N][N][N/2];

int main()
{
	cin >> s+1>> t+1;

	int len1 = strlen(s + 1);
	int len2 = strlen(t + 1);


	f[0][0][0] = true;

	for(int i=0;i<=len1;i++)
		for(int j=0;j<=len2;j++)
			for (int k = 0; k <=len1 / 2; k++)
			{
				if (f[i][j][k])
				{
					if (k == 0 && s[i + 1] == t[j + 1]) f[i + 1][j + 1][0] = true;

					if (s[i + 1] == '(') f[i + 1][j][k + 1] = true;
					else if (k > 0)
						f[i + 1][j][k - 1] = true;
				}

			}

	if (f[len1][len2][0]) puts("Possible");
	else puts("Impossible");

	return 0;
}

在这里要注意:下标要从0开始因为第一个括号也要算进去,也就是对于t没有字符的情况下s要删一个’(‘可以和t一样,即dp[1][0][1]=true(处理边界) (如果不处理会被特殊情况卡,我在这被卡了好久)

()(((())))
(((())))
正确答案:Possible
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值