统计两个串里所有字符的个数,减一减就行了,把这个当做剪枝条件(爆搜+剪枝)
#include<bits/stdc++.h>
using namespace std;
int n;
string s,t;
int a,b,c;
int p[5010],q[5010],r[5010];
string dfs(int x,int a,int b,int c)
{
if(x==n+1)
return "";
string ans="no";
int i=a+p[x],j=b+q[x],k=c+r[x];
if(i+j<k)
return ans;
if(j+k<i)
return ans;
if(k+i<j)
return ans;
if(t[x-1]!='a'&&a&&ans=="no")
{
string tmp=dfs(x+1,a-1,b,c);
if(tmp!="no")
ans="a"+tmp;
}
if(t[x-1]!='b'&&b&&ans=="no")
{
string tmp=dfs(x+1,a,b-1,c);
if(tmp!="no")
ans="b"+tmp;
}
if(t[x-1]!='c'&&c&&ans=="no")
{
string tmp=dfs(x+1,a,b,c-1);
if(tmp!="no")
ans="c"+tmp;
}
return ans;
}
int main()
{
scanf("%d",&n);
cin>>s>>t;
for(int i=1;i<=n;i++)
{
switch(s[i-1])
{
case 97:a++; break;
case 98:b++; break;
case 99:c++; break;
}
}
for(int i=n;i>=1;i--)
{
p[i]=p[i+1];
q[i]=q[i+1];
r[i]=r[i+1];
switch(t[i-1])
{
case 97:p[i]++; break;
case 98:q[i]++; break;
case 99:r[i]++; break;
}
}
cout<<dfs(1,a,b,c);
return 0;
}