手动模拟操作过程后,可以得到有用的信息为当前进行到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; }