手动模拟操作过程后,可以得到有用的信息为当前进行到s串和t串的位置
所以我们记f[i][j]表示s串前i为能否于t串的前j位匹配
对于当前的f[i][j],我们有以下情况
- s[i]=t[j] , f[i][j]=f[i-1][j-1]
- s[i]!=t[j]
①s[i]='(' 那么这个位置一定是无法匹配的!
②s[i]=')' 那么我们可以尝试删除s串末尾的匹配()对
代码
#include<bits/stdc++.h>
using namespace std;
char s[105],t[105];
int f[105][105];
int main()
{
f[0][0]=1;
scanf("%s%s",s,t);
int len1=strlen(s);
int len2=strlen(t);
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(s[i-1]==t[j-1]) f[i][j]|=f[i-1][j-1];
if(s[i-1]==')')
{
int l=1,r=i-1;
while(l)
{
if(s[r-1]==')') l++;
else l--;
r--;
}
f[i][j]|=f[r][j];
}
}
}
if(f[len1][len2]) printf("Possible");
else printf("Impossible");
return 0;
}
京公网安备 11010502036488号