字母重排
输入一个字典(用******结尾),然后再输出若干个单词。每输入一个单词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; }