【Zhou Ping 's 解題報告】為了有資格參加亞洲區ACM而奮鬥
阿新 • • 發佈:2019-02-10
C 字串轉換
Accept:78 |
Submit:471 |
Time Limit:1000MS |
Memory Limit:65536KB |
Description
我們將僅由若干個同一小寫字母構成的字串稱之為簡單串,例如"aaaa"是一個簡單串,而"abcd"則不是簡單串。現在給你一個僅由小寫字母組成的字串,你需要用最小的花費,將其轉換成一個簡單串。 花費的計算規則如下:將a到z這26個小寫字母從左到右排成一排,則每個字母都有左右兩個鄰居,我們認為a的左鄰居是z,z的右鄰居是a。一個字母只能轉換成其相鄰的字母,轉換的花費為1。一個字母可以進行多次轉換,例如將a轉換成 d,可以進行如下的步驟: a->b->c->d,花費為3。字串的轉換花費為所有字母轉換花費之和。例如將字串"abbbz"轉換成簡單串的最小花費為3,轉換後的結果為"bbbbb"。
InputFormat
第一行一個整數T(T≤100),表示測試資料的組數。 每組測試資料只有一行,為僅含小寫字母的字串,字串長度不超過1000。
OutputFormat
對於每一組資料,輸出一個整數,表示將字串轉換成簡單串的最小花費。
SampleInput
2
abbba
abbac
SampleOutput
2
3
# include <stdio.h> # include <string.h> int main() { int t, l, temp; int i, j, k; char str[1002], ch[26]; int n[26]; scanf("%d", &t); ch[0] = 'a'; for (i = 0; i < 26; i++) ch[i + 1] = ch[i] + 1; for (k = 0; k < t; k++) { scanf("%s", str); memset(n, 0, sizeof(n)); l = strlen(str); for (j = 0; j < 26; j++) { for (i = 0; str[i] != '\0'; i++) { if (str[i] == ch[j]) n[j]++; } } for (i = 0; i < 26; i++) for (j = 0; j < 26 - i; j++) if (n[j + 1] < n[j]) { temp = n[j + 1]; n[j + 1] = n[j]; n[j] = temp; } printf("%d\n", l - n[25]); } return 0; }