游游的字母串
链接:https://ac.nowcoder.com/acm/contest/66943/B
来源:牛客网
对于一个小写字母而言,游游可以通过一次操作把这个字母变成相邻的字母。'a'和'b'相邻,'b'和'c'相邻,以此类推。特殊的,'a'和'z'也是相邻的。可以认为,小写字母的相邻规则为一个环。
游游拿到了一个仅包含小写字母的字符串,她想知道,使得所有字母都相等至少要多少次操作?
输入描述:
一个仅包含小写字母,长度不超过100000的字符串。
输出描述:
一个整数,代表最小的操作次数。
示例1
输入
yab
输出
3
说明
第一次操作,把'y'变成'z',字符串变成了"zab"
第二次操作,把'b'变成'a',字符串变成了"zaa"
第三次操作,把'z'变成'a',字符串变成了"aaa"
很明显这个就是先遍历出来每一个s[i],变成字符j的次数dp[i][j],最后我们遍历每一个字母就行
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e5+100;
int dp[maxn][32];
char s[maxn];
int get(char a,char b){
if(a>b){
swap(a,b);
}
int c=b-a;
c=min(c,a-'a'+'z'-b+1);
return c;
}
int main(){
scanf("%s",s);
int len=strlen(s);
for(int i=0;i<len;i++){
for(char j='a';j<='z';j++){
dp[i][j-'a']=get(s[i],j);
}
}
int minn=1e9;
for(int i=0;i<26;i++){
int sum=0;
for(int j=0;j<len;j++){
sum+=dp[j][i];
}
minn=min(minn,sum);
}
cout<<minn<<endl;
}