首页 > 代码库 > 转换为回文的步数
转换为回文的步数
James找到了他的朋友Harry要给女朋友的情书。James很爱恶作剧,所以他决定要胡搞一下。他把信中的每个单字都变成了回文。对任何给定的字符串,他可以减少其中任何一个字符的值,例如‘d‘可以变成‘c‘,这算是一次操作。(另外,他最多只能将字符的值减少至‘a‘,‘a‘不能再被减少成‘z‘)。找出将给定字符串转换成回文所需的最少操作次数。
输入格式
第一行包含整数 T 代表测试数据的组数。
接着 T 行各包含一个字符串。
输出格式
每个测试数据各输出一行,代表此数据需要的最少操作次数。
取值范围
1 ≤ T ≤ 10
1 ≤ 字符串长度 ≤ 104
样例输入 #00
3abcabcbaabcd
样例输出 #00
204
样例解析
第一组数据:ab*c* -> ab*b* -> ab*a*。
第二组数据:abcba本身已经是回文了。
第三组数据:abc*d* -> abc*c* -> abc*b* -> abc*a* = ab*c*a -> ab*b*a。
1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 int getChangeToPalindromeStep(char *string); 5 6 int main(int argc, const char * argv[]) 7 { 8 9 // insert code here...10 // printf("Hello, World!\n");11 int stringCount = 0;12 // printf("input string count: ");13 scanf("%d", &stringCount);14 int totalStep = 0;15 int stepCount[10];16 for (int i=0; i<stringCount; i++) {17 // printf("input string%d : \n", i);18 char string[10000];19 scanf("%s", string);20 // printf("%s\n", string);21 stepCount[i] = getChangeToPalindromeStep(string);22 // printf("need step : %d\n", stepCount);23 totalStep += stepCount[i];24 }25 for (int i=0; i<stringCount; i++) {26 printf("%d\n", stepCount[i]);27 }28 // printf("total need step : %d\n", totalStep);29 return 0;30 }31 32 int getDiffValue(char *c1, char *c2)33 {34 int ic1 = (int)*c1;35 int ic2 = (int)*c2;36 return (int)fabs(ic1 - ic2);37 }38 39 int getChangeToPalindromeStep(char *string)40 {41 if (string == NULL) {42 return 0;43 }44 if (strlen(string) == 0 || strlen(string) == 1) {45 return 0;46 }47 48 int posStart = 0;49 int posEnd = (int)strlen(string) - 1;50 51 int step = 0;52 while (posStart < posEnd) {53 step += getDiffValue(string + posStart, string + posEnd);54 posStart++;55 posEnd--;56 }57 58 return step;59 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。