90. 字符串轉換
題目描述
我們將僅由若干個同一小寫字母構成的字符串稱之為簡單串,例如"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
分析:兩個for循環枚舉輸入的每組數據中的每個字符到達每個字符的花費,然后比較求出最小值輸出。
//翻了個錯誤,只意識到向后轉換沒有意識到向前也可以轉換,這兩個中選花費最少的
//#define min(a,b) a<b?a:b
//最小值得求法 min(abs(i-j),26-abs(i-j));
#include <iostream>
#include <string>
#include <cmath>
//#include <cstdlib>
#define min(a,b) a<b?a:b
using namespace std;
int main ()
{
string mystr;
int n;
int m[1001];//暫存數據
char mych = NULL;
int cost;
int mymin;
int myout[101];
cin >> n;
for (int i_1 = 0;i_1 < n;i_1++)
{
cin >> mystr;
//計算每一個字符的花費,最后比較選出最小
for (int i_2 = 0;i_2 < mystr.length();i_2++)
{
//if (mych == mystr[i_2])//已經有過這個字母了,不需要繼續比較了
//{
// continue;
//}
mych = mystr[i_2];
cost = 0;
for (int i_3 = 0;i_3 < mystr.length();i_3++)
{
cost += min(abs(mystr[i_3] - mych),26-abs((mystr[i_3] - mych)));//計算出每一個單詞的花費
}
m[i_2] = cost;//暫存一組數據中每個單詞的最小花費
//cout <<cost <<endl;
}
//cout << m[0]<< m[1]<< m[2]<<endl;
//比較,選出改組的最小值
mymin = m[0];
for (int i_4 = 1;i_4 < mystr.length();i_4++)
{
if (mymin > m[i_4])
{
mymin = m[i_4];
}
}
//cout << mymin <<endl;
myout[i_1] = mymin;
//cout << sizeof(m)/sizeof(m[0]) <<endl;
}
//輸出結果
for (int i_5 = 0;i_5 < n; i_5++)
{
cout << myout[i_5] <<endl;
}
return 0;
}