1. 程式人生 > >BUPT復試專題—字符串轉換(2013計院)

BUPT復試專題—字符串轉換(2013計院)

string number body 例如 str -- 字符串轉換 while span

題目描述

我們將僅由若幹個同一小寫字母構成的字符串稱之為簡單串,例如"aaaa"是一個簡單串,而"abcd"則不是簡單串。現在給你一個僅由小寫字母組成的字符串,你需要用最小的花費,將其轉換成一個簡單串。 花費的計算規則如下:將a到z這26個小寫字母從左到右排成一排,則每個字母都有左右兩個鄰居,我們認為a的左鄰居是z,z的右鄰居是a。一個字母只能轉換成其相鄰的字母,轉換的花費為1。一個字母可以進行多次轉換,例如將a轉換成d,可以進行如下的步驟: a->b->c->d,花費為3。字符串的轉換花費為所有字母轉換花費之和。例如將字符串"abbbz"轉換成簡單串的最小花費為3,轉換後的結果為"bbbbb"。

輸入格式

第一行一個整數T(T100),表示測試數據的組數。 每組測試數據只有一行,為僅含小寫字母的字符串,字符串長度不超過1000。

輸出格式

對於每一組數據,輸出一個整數,表示將字符串轉換成簡單串的最小花費。

輸入樣例

2
abbba
abbac

輸出樣例

2
3


註意審題是循環比較
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
#define
INF 0x7fffffff using namespace std; int mins(int a,int b,int c) { if(a>=b&&c>=b) return b; else if(c>=a&&b>=a) return a; else if(a>=c&&b>=c) return c; } int main() { int tes,m; while(~scanf("%d",&tes)) { map
<int,int> donser; while(tes--) { for(int i=0;i<26;i++) donser[i]=0; string s; cin>>s; int y=0; while(y<s.size()) { donser[s[y]-a]++; y++; } int number=s.size(); int min=INF; for(int i=0;i<26;i++) { int tor=0; for(int j=0;j<26;j++) { tor+=mins(abs(j-i),abs(26-j+i),abs(26-i+j))*donser[j]; //cout<<"*"<<tor<<" "<<i<<" "<<j<<" "<<donser[j]<<endl; } if(tor<min) min=tor; } cout<<min<<endl; } } return 0; }

 

BUPT復試專題—字符串轉換(2013計院)