1. 程式人生 > >【Zhou Ping 's 解題報告】為了有資格參加亞洲區ACM而奮鬥

【Zhou Ping 's 解題報告】為了有資格參加亞洲區ACM而奮鬥



C  字串轉換

Accept:78  

  Submit:471

Time Limit:1000MS  

  Memory Limit:65536KB

Description

我們將僅由若干個同一小寫字母構成的字串稱之為簡單串,例如"aaaa"是一個簡單串,而"abcd"則不是簡單串。現在給你一個僅由小寫字母組成的字串,你需要用最小的花費,將其轉換成一個簡單串。 花費的計算規則如下:將az26個小寫字母從左到右排成一排,則每個字母都有左右兩個鄰居,我們認為a的左鄰居是zz的右鄰居是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; 
 }