chenxizhan1995 2019-11-21 23:47 采纳率: 100%
浏览 310
已采纳

在线编程习题“2110: 虚张声势”总是不能拿满分,找不到问题出在哪了?

题目描述
大战即将来临,杰洛特需要为自己声张声势,但是喊得太假有会被人识破
    因此杰洛特决定连着喊出两句话,两句话中所有的字母数量全部相等则不会被识破
    请指出杰洛特所喊的话是否会被识破

输入
一个t表示几组数据
    接下来t组,每组第一行一句话,第二行一句话
    每句话长度小于100000

输出
如果杰洛特没有被识破则输出"Yes"
    如果被识破了则喊出"No"
样例输入

2
wj nb
w jnb
Iiread
readii

样例输出

Yes
No

原题链接:问题 2110: 虚张声势

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 100000

int cmp(char *s, char *t){return *s - *t;} // 比较函数
// 去掉t中的空白字符,升序排序后存入s
static inline void trip_sort(char *s, char *t){
    char *p, *delim = "\x20\t"; // 空白字符
    p = strtok(t, delim);
    *s = 0;
    do{ strcat(s, p); }while((p = strtok(NULL, delim)));
    qsort(s, strlen(s), 1, (void*)cmp);
}
// 当 cs 和 ct 中字符和每个字符的个数都一样时,返回 true,否则返返回false。
char* equal(char *cs, char * ct){
    static char b1[N], b2[N];
    trip_sort(b1, cs);
    trip_sort(b2, ct);
    return strcmp(b1, b2) ? "No":"Yes";
}

char buf1[N], buf2[N];
int main(void)
{   // 策略是:把两句话去掉空白字符,升序排序字符,比较字符串是否相等;

    scanf("%*d\n"); // 丢弃数字行
    // 一次读入两行,直到EOF
    while (gets(buf1) && gets(buf2)) puts(equal(buf1, buf2));
    return 0;
}

PS:分别计算各个字母出现的次数,然后比较,这样可以通过全部测试用例。但我也想弄清楚上面的代码问题出在哪里?

  • 写回答

1条回答 默认 最新

  • 神隐的小蝴蝶 2019-11-22 22:51
    关注

    非字母字符不一定是空格, 可能是标点符号呢。trip_sort中数组复制可以改成这样:

    static inline void trip_sort(char *s, char *t){
        char * p = s;
        while(*t != NULL){
            if((*t >='a' && *t <= 'z') || (*t >='A' && *t <= 'Z')) {
                *p = *t;
                p++;
            }
            t++;
        }
        *p = 0;
        qsort(s, strlen(s), sizeof(char), (void*)cmp);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料