游游的字母串

发布时间 2023-10-26 17:47:33作者: 哎呦哎(iui)

链接: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;
}