算法篇 干货!!!字母重排 打卡第五天

题目
输入一个字典(用******结尾),然后再输入若干个单词。每输入一个单词w,你都需要在字典中找出所有可以用w的字母重排后得到的单词,并按照字典序从小到大的顺序在一行中输出(如果不存在,输出0)。输入单词之间用空格或空行隔开,并所有输入单词都由不超过6个小写字母组成。注意,字典中的单词不一定按字典序排列。

样例输入

tarp given score rfund only trap work earn course pepper part


resco nfudre aptr sett oresuc

样例输出

score
refund
part tarp trap
0
course
分析
首先需要把字典读入并保存下来。接下来需要怎么做呢?最容易想到的方法是(1)没读入一个单词,就和字典中的所有单词比较,看看是否可以通过重排得到。
(2)把可以重排得到的单词放在一个数组中。
(3)把这个数组排序后输出。
这样做当然是正确的,但是显得很笨拙。那该怎么办呢?下面看看这3个步骤能否简化。
如何判断两个单词是否可以通过重排得到呢?? ?
思考就会发现:把各个字母排序,然后直接比较即可。既然如此,我们可以在读入时就把每个单词按照字母排好序,就不必再次重排了。
是不是必须把重排的单词保存下来再排序呢???
这个也没有必要,只要在读入字典之后把所有单词排序,就可以每遇到一个满足条件的单词就立刻输出。说了这么多,不知道你们看懂了吗?
下面是程序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n;
char word[2000][10];
char sorted[2000][10];
int cmp_char(const void*_a,const void*_b)/*字符比较函数*/
{
    char *a=(char*)_a;
    char *b=(char*)_b;
    return *a-*b;
}
int cmp_string(const void*_a,const void*_b)/*字符串比较函数*/
{
    char *a=(char*)_a;
    char *b=(char*)_b;
    return strcmp(a,b);
}
int main()
{
    n=0;
    for(;;)
    {
        scanf("%s",word[n]);
        if(word[n][0]=='*')
            break;/*遇到结束标志就终止循环*/
        n++;
    }
    qsort(word,n,sizeof(word[0]),cmp_string);/*给所有单词排序*/
    for(int i=0;i<n;i++)
    {
        strcpy(sorted[i],word[i]);
        qsort(sorted[i],strlen(sorted[i]),sizeof(char),cmp_char);/*给每个单词排序*/
    }
    char s[10];
    while(scanf("%s",s)==1)/*持续读取到文件结尾*/
    {
        qsort(s,strlen(s),sizeof(char),cmp_char);/*给输入单词排序*/
        int found=0;
        for(int i=0;i<n;i++)
        {
            if(strcmp(sorted[i],s)==0)
            {
                found=1;
                printf("%s ",word[i]);/*输出原始单词,而不是排序后的*/
            }
        }
        if(!found)
            printf("0");
            printf("\n");
    }
    return 0;
}


注意
不管是把字符串中的各个字符排序还是把所有字符串排序,上面的代码都用到了stdlib.h中的排序函数qsort。使用库函数排序的代码量不比冒泡排序法小,但速度却快很多(以后会讲到原因)。

寄语
不要放弃,你要配得上你的野心,更不要辜负自己为此所受的磨难!!!

欢迎关注!欢迎评论!!欢迎私信!!!(多亏上次有一个大佬(不知是学长还是学姐)评论我的博文的时候,提到了qsort函数,才让我对此有了更深的理解,各位大佬踩文的时候,欢迎提建议,你们提的建议是我取得进步的捷径,可以让我少走些弯路!!!)

补充】(我是英语小菜鸡,英语大佬不要介意哈)

tarp

网络 防水布; 油布; 不良资产救助计划; 问题资产救助计划; 美国问题资产救助计划;
[例句]Funds from the Troubled Asset Relief Program are only replacing lost capital, not increasing it.
问题资产救助计划(tarp)提供的资金只是替代了失去的资本金,而没有增加资本金。

given

adj. 已经安排好的; 规定的; 指定的; 所述的; 特定的;
prep. 考虑到; 鉴于;
n. 假设事实;
[例句]In chess there are typically about 36 legal moves from any given board position
在国际象棋中,一般来说从棋盘任何位置都可以移动大约36步。
[其他] 原型: give

score

n. (游戏或比赛中的) 得分,比分; (考试中的) 分数,成绩; 总谱;
v. (在游戏或比赛中) 得分; (在游戏或比赛中) 记分; (在考试中) 得分;
[例句]Against which country did Ian Wright score his first international goal?
在与哪个国家的比赛中伊恩·赖特打进了他在国际比赛中的首粒进球?
[其他] 第三人称单数:scores 复数:scores 现在分词:scoring 过去式:scored 过去分词:scored

refund

n. 退款; 返还款; 偿还金额;
v. 退还; 退(款); 偿付;
[例句]Take the goods back to your retailer who will refund you the purchase price.
把商品退还给你的零售商,他们会按原价退款的。
[其他] 第三人称单数:refunds 复数:refunds 现在分词:refunding 过去式:refunded 过去分词:refunded

trap

n. (捕捉动物的) 陷阱,罗网,夹,捕捉器; 圈套; 诡计; (难以逃脱的) 困境,牢笼;
v. 使落入险境; 使陷入困境; 卡住; 夹住; 绊住; 缠住; 收集; 吸收;
[例句]The locals were encouraged to trap and kill the birds.
当地居民过去被鼓励设捕捉器捕杀这种鸟。
[其他] 第三人称单数:traps 复数:traps 现在分词:trapping 过去式:trapped 过去分词:trapped

course

n. (有关某学科的系列) 课程,讲座; (大学中要进行考试或取得资格的) 课程; (船或飞机的) 航向,航线;
v. 快速地流动; 奔流;
[例句]Aircraft can avoid each other by going up and down, as well as by altering course to left or right
飞机可以通过上下升降和左右移动改变航线来避免相撞。
[其他] 第三人称单数:courses 复数:courses 现在分词:coursing 过去式:coursed

pepper

n. 胡椒粉; 甜椒; 柿子椒; 灯笼椒;
v. (在食物上) 撒胡椒粉;
[例句]Season with salt and pepper.
用盐和胡椒调味。
[其他] 第三人称单数:peppers 复数:peppers 现在分词:peppering 过去式:peppered 过去分词:peppered

发布了22 篇原创文章 · 获赞 19 · 访问量 5896

猜你喜欢

转载自blog.csdn.net/qq_45748475/article/details/104256041