C练题笔记之:牛客-HJ027.查找兄弟单词

这是一篇关于使用C语言解决寻找特定单词的‘兄弟单词’问题的笔记。问题要求找到给定单词在字典序下的第k个兄弟单词。文章详细介绍了解题思路,包括获取数据、排序、判断兄弟单词等步骤,并提供了相应的代码实现。

题目:

描述

定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。

兄弟单词要求和原来的单词不同。例如:ab和ba是兄弟单词。ab和ab则不是兄弟单词。

现在给定你n个单词,另外再给你一个单词str,让你寻找str的兄弟单词里,按字典序排列后的第k个单词是什么?

注意:字典中可能有重复单词。本题含有多组输入数据。

输入描述:

先输入单词的个数n,再输入n个单词。 再输入一个单词,为待查找的单词x 最后输入数字k

输出描述:

输出查找到x的兄弟单词的个数m 然后输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。

示例1

输入:

3 abc bca cab abc 1

输出:

2
bca

示例2

输入:

6 cab ad abcd cba abc bca abc 1

输出:

3
bca

说明:

abc的兄弟单词有cab cba bca,所以输出3
经字典序排列后,变为bca cab cba,所以第1个字典序兄弟单词为bca

结果:

解题思路:

1,获取所有数据,分为,单词数量n,单词list:strList,比对对象word,取值第index个。

2,将list进行字典序排序,用于计算第index个输出的时候好计算。

3,将word按照字母顺序排序,存于tempWord中用于判断兄弟单词是否一样。

4,循环判断每一个单词,单词长度不对的不与比较,单词与word原词一样的不与比较。其他的按照字典序排序之后和tempWord排序,如果一样则count + 1,当count+1之后和index一样,则记录下标。

5,当有第index个数据符合的时候则输出,如果没有则直接换行。

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int comWord(const void *a, const void *b) {
    return *(char *)a - *(char *)b;
}
int compList(const void *a, const void *b) {
    return strcmp(*(char **)a, *(char **)b);
}
int main() {
    int n;
    while(scanf("%d", &n) != EOF) {
        /*第一步:获取所有数据*/
        char **strList = (char **)malloc(sizeof(char *) * n);
        for(int i = 0; i < n; i++) {
            strList[i] = (char *)malloc(sizeof(char) * 1024);
            scanf("%s", strList[i]);
        }
        qsort(strList, n, sizeof(strList[0]), compList);
        char word[1024] = {};
        scanf("%s", word);
        int index;
        scanf("%d", &index);
        /*第二步:将获取到的list用字典序排序*/
        int count = 0;
        int len = strlen(word);
        //获取temp的比对标准,将该单词按照字母顺序排序。
        char tempword[1024];
        int outIndex = -1;
        strcpy(tempword, word);
        qsort(tempword, len, sizeof(char), comWord);
        /*第三步:将获取到的数据一个个和要比对的单词比对*/
        for(int i = 0; i < n; i++) {
            int tempLen = strlen(strList[i]);
            if(tempLen != len) continue;
            if(!strcmp(word, strList[i])) continue;
            char templist[1024];
            strcpy(templist, strList[i]);
            qsort(templist, tempLen, sizeof(char), comWord);
            if(!strcmp(templist, tempword)) {
                count++;
                if(count == index) {
                    outIndex = i;
                }
            }
        }
        /*第四步:打印所有数据*/
        printf("%d\n", count);
        if(outIndex >= 0) {
            printf("%s\n", strList[outIndex]);
        } else {
            printf("\n");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值