您的位置:首页 > 其它

ZOJ-2585

2014-04-07 21:29 183 查看
求回文距离,算比较水吧,第一次提交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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: