题目链接
思路:
dfs+二分遍历整个字符串,然后每次都跑整个区间来判断需要改变的字母的多少,取最小值。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N=2e5+7;
const double eps=1e-8;
const int mod=1e9+7;
const int inf=0x7fffffff;
const double pi=3.1415926535;
char s[N];
int solve(int l, int r, char c)
{
if (l==r)
{
return s[l]!=c;
}
int mid=(l+r)/2;
int left=0,right=0;
for (int i = l; i <= mid; i++)
{
left+=s[i]!=c;
}
for(int i=mid+1;i<=r;i++)
{
right+=s[i]!=c;
}
return min(left+solve(mid+1,r,c+1),right+solve(l,mid,c+1));
}
signed main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
cin>>s+1;
cout<<solve(1,n,'a')<<endl;
}
return 0;
}