ZOJ-2585

来源:互联网 发布:淘宝泰隆达是正 编辑:程序博客网 时间:2024/06/18 12:18

求回文距离,算比较水吧,第一次提交AC了60ms,看看别人的时间好少,发现算法可以改进,完全就不用排序,直接开个数组计数就行了,改进后就只用10ms了,附上改进前后代码

改进前:

#include<stdio.h>#include<string.h>#include<stdlib.h>static int cmp(const void *p1, const void *p2){char *c1 = (char *) p1;char *c2 = (char *) p2;return *c1 - *c2;}int main(){int k, i, j, n;char s[100], t[100];scanf("%d", &n);getchar();for (k = 1; k <= n; k++){gets(s);gets(t);int total = 0, a = strlen(s), b = strlen(t);qsort(s, a, sizeof(char), cmp);qsort(t, b, sizeof(char), cmp);i = j = 0;while (i < a && j < b){if (s[i] < t[j]){i++;total++;}else if (s[i] > t[j]){j++;total++;}else{i++;j++;}}total += a - i + b - j;printf("Case #%d:  %d\n", k, total);}return 0;}

改进后:

#include<stdio.h>#include<string.h>#include<stdlib.h>int main(){int k, i, j, n, a[26], b[26];char s[100];scanf("%d", &n);getchar();for (k = 1; k <= n; k++){int total = 0;memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));gets(s);for (i = 0; s[i] != '\0'; i++)a[s[i] - 'a']++;gets(s);for (i = 0; s[i] != '\0'; i++)b[s[i] - 'a']++;for (i = 0; i < 26; i++)total += abs(a[i] - b[i]);printf("Case #%d:  %d\n", k, total);}return 0;}


0 0
原创粉丝点击