链接: D a-Good String
题意:
大概就是给一个长度为 2 ^ k 的字符串,要变成好的字符串,至少要改变多少个字符,好字符串的定义是 :左边或者右边 len /2 个为 a ,则另外一边的左边或右边一半为 b ,就这么递归下去(有点难表述,看了半天才看懂)。
思路:
dfs 枚举所有可能的情况 ,左边一半选当前字符还是右边一半取当前字符,计算出不同字符数,取较小的。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<cmath>
#include<string>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=2e5+7;
int T,n;
string str;
int dfs(string s,char ch){
if(s.size()==1){
return ch!=s[0];
}
if(s.size()==0) return 0;
int len=s.size();
string ss1(s.begin(),s.begin()+s.size()/2);
string ss2(s.begin()+s.size()/2,s.end());
int ans1=0,ans2=0;
for(int i=0;i<len/2;i++){
if(ss1[i]!=ch) ans1++;
}
for(int i=0;i<len/2;i++){
if(ss2[i]!=ch) ans2++;
}
return min(dfs(ss1,ch+1)+ans2,dfs(ss2,ch+1)+ans1);
}
int main (){
cin>>T;
while(T--){
scanf("%d",&n);
cin>>str;
int ans=dfs(str,'a');
printf ("%d\n",ans);
}
}