字母重排

输入一个字典(用******结尾),然后再输出若干个单词。每输入一个单词W,你都要在字典中找出所有可以用W的字母重排后得到的单词,

并按照字典序从小到大的顺序在一行中输出(如果不在,输出:(  )。输入单词之间用空格或空行隔开,且所有输入单词都由不超过6个小写

字母组成。注意,字典中的单词不一定按字典序排列。

 

样例输入:

tarp given score refund only trap work earn course pepper part

******

resco nfudre aptr sett oresuc

样例输出:

score

refund

part tarp trap

:(

course

 

解题思路:

1),每读入一个单词,就和字典中的所有单词比较,看看是否可以通过重排得到

2)把重排得到的单词放在一个数组中

3)把这个数组排序后输出

 

这里我们做一些简化:

如何判断两个单词是否可以通过重排得到呢?

稍微思考下发现,把各个字母排序,然后直接比较即可,所以我们在读入时就按字母排序,就不用在单独重拍了。

在读入字典之后把所有单词排序,就可以在每遇到一个满足条件就立刻输出。

//
//  main.cpp
//  c++prime
//
//  Created by SJCHEN on 2019/1/19.
//  Copyright © 2019 SJCHEN. All rights reserved.
//

//
//  main.cpp
//  c++prime
//
//  Created by SJCHEN on 2019/1/19.
//  Copyright © 2019 SJCHEN. All rights reserved.
//

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
int n;
char word[2000][10], sorted[2000][10];

//r字符比较函数
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);//字符串计较,相等返回0.a大h返回大于0.小返回小于0
}

int main()
{
    n = 0;
    for (;;) {
        cin >> 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]);//word[i]要复制的数组,sorted[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(":(");
        printf("\n");
    }
    return 0;
}

 

posted @ 2019-03-27 08:06  codeSJCHEN  阅读(303)  评论(0编辑  收藏  举报