本就想暴力膜試一下,沒想到竟然AC了。。。原來是道枚舉搜索的題。不過也對,複雜度就在百萬級別,沒道理超時。
題目描述
我們將僅由若干個同一小寫字母構成的字符串稱之爲簡單串,例如”aaaa”是一個簡單串,而”abcd”則不是簡單串。現在給你一個僅由小寫字母組成的字符串,你需要用最小的花費,將其轉換成一個簡單串。 花費的計算規則如下:將a到z這26個小寫字母從左到右排成一排,則每個字母都有左右兩個鄰居,我們認爲a的左鄰居是z,z的右鄰居是a。一個字母只能轉換成其相鄰的字母,轉換的花費爲1。一個字母可以進行多次轉換,例如將a轉換成d,可以進行如下的步驟: a->b->c->d,花費爲3。字符串的轉換花費爲所有字母轉換花費之和。例如將字符串”abbbz”轉換成簡單串的最小花費爲3,轉換後的結果爲”bbbbb”。
輸入格式
第一行一個整數T(T≤100),表示測試數據的組數。 每組測試數據只有一行,爲僅含小寫字母的字符串,字符串長度不超過1000。
輸出格式
對於每一組數據,輸出一個整數,表示將字符串轉換成簡單串的最小花費。
輸入樣例
2
abbba
abbac
輸出樣例
2
3
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXSIZE 1010
#define INF 0x7fffffff
using namespace std;
int abs(int x){
return x>0?x:-x;
}
int main(){
int t;
int len;
int dist,sum,min;
char str[MAXSIZE];
scanf("%d",&t);
while (t--){
//input && initiate
scanf("%s",str);
len=strlen(str);
min=INF;
//cal
for (char i='a';i<='z';i++){//±éÀúÿ¸ö¿ÉÄÜת»»³ÉµÄ×Ö·û
//initiate
sum=0;
for (int j=0;j<len;j++){//±éÀú´®¼ÆËã´Ë´Îת»»³É±¾
dist=abs(str[j]-i);
if (dist>13)
dist=26-dist;
sum+=dist;
}
if (sum<min)
min=sum;
}
//output
printf("%d\n",min);
}
return true;
}