字母重排序问题

题目描述:

输入一个字典(用******结尾),然后再输入若干单词w,你
都需要在字典中找出所有的w的字母重排后得到的单词,并按照字典序冲销到大的
顺序在一行中输出(如果不存在,输出:()。输入单词之间用空格或则空行隔开,
且所有的输入单词都由不草果6个字母组成,注意字典的单词不一定按照字典的书序排列
 
样例输入
tarp given score refund only trap work carn work earn course pepper part
******
resco nfudre aptr sett oresuc

样例输出
score
refund
part tarp trap
:(
course
 
分析:
1.首先,是要将字典里的单词按照字典序,记为word[i],这可以写一个字符串比较函数cmp,利用库函数中的qsort(数组,元素个数,每个元素空间(sizeof(char),自己写的比较函数))。
   对于比较函数cmp 有固定的格式,而字符串比较,直接利用strcmp函数作为比较方法即可  

            int cmp(const void *p1,const void *p2)

           {

                    return strcmp((char *)p2,(char *)p1);

          }
2.接着对于字典中的单词,每一个元素内部都要进行字典排序记为sorted[i],例如“tape”排完序后为“aept”,还要写个字符比较函数直接比较字符的ascii值即可,依旧利用qsort。
3.用上一个方法对输入的字符串的数组str进行字符的字典排序。
4.依次比较输入的字符str和sorted[i],若相同,说明输入字符的某种排列能形成word[i].
5.直接输出匹配的word[i],并继续比较,直至结束。
 1 #include<stdio.h>
 2 #include<math.h>
 3 #include<assert.h>
 4 #include<string.h>
 5 #include<stdlib.h>
 6 char word[2000][10],sorted[2000][10];
 7 int n;//字典单词个数
 8 
 9 int cmp_char(const void* _a,const void* _b)//单个字符比较
10 {
11     char* a=(char*)_a;
12     char* b=(char*)_b;
13     return *a-*b;
14 }
15 
16 int cmp_string(const void* _a,const void* _b)
17 {
18   char* a=(char*)_a;
19   char* b=(char*)_b;
20   return strcmp(a,b);
21 }
22 int main()
23 {
24     n=0;
25     while (scanf("%s",word[n])!=EOF)//读入
26     {
27         if(word[n][0]=='*')
28             break;
29         n++;
30     }
31     qsort(word,n,sizeof(word[0]),cmp_string);//对单词进行
32     for(int i=0;i<n;i++)
33     {
34         strcpy(sorted[i],word[i]);
35         qsort(sorted[i],strlen(sorted[i]),sizeof(char),cmp_char);
36     }
37     char s[10];
38     while(scanf("%s",s)==1)
39     {
40         qsort(s,strlen(s),sizeof(char),cmp_char);
41         int found=0;
42         for(int i=0;i<n;i++)//继续找
43         if(strcmp(sorted[i],s)==0)
44         {
45             found=1;
46             printf("%s",word[i]);
47         }
48         if(!found)printf(":(");
49         printf("\n");
50     }
51     return 0;
52 }

 

转载于:https://www.cnblogs.com/renhongleiz/p/3223990.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值