串串

博客探讨了如何统计两个字符串中字符出现的次数,并利用这些信息进行剪枝操作,以优化搜索效率。通过将字符计数作为剪枝条件,可以有效地减少搜索空间,提高算法性能。

在这里插入图片描述
在这里插入图片描述
统计两个串里所有字符的个数,减一减就行了,把这个当做剪枝条件(爆搜+剪枝)

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值