好久没有上来写东西了。中秋放假以后有点放松自己了。今天先看了入门经典的书都一题就拿上来作为新的开始吧。
字母重排
输入一个字典(用******结尾),然后再输入若干单词。每输入一个单词w,你都需要在字典中找出所有可以用w的字母重排后得到的单词,并按照字典序从小到大的顺序在一行中输出(如果不存在,输出:()。输入单词之间用空格或空行隔开,且所有输入单词都由不超过6个小写字母组成。注意,字典中的单词不一定按字典序排列。样例输入:tarp given score refund only trap work earn course pepper part ******resco nfudre aptr sett oresuc样例输出:scorerefundpart trap trap:(course
代码写的比较乱也没有注释,其实就是简单的字符串处理,利用ASCII码比较大小。
题意就是给定几个单词,然后再给出一行************************,再给输入一些单词,然后判断是否能够与上面给定的单词的字母重排后组成这个单词。
我的解决办法就是直接通过字母排序,因为两个单词如果字母排序后利用strcmp比较得0那么肯定可以重排组成。
resortletter.cpp
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 10
#define MAXNU 500
typedef struct DIC
{
char orstr[MAXN];
char chstr[MAXN];
void change()
{
strcpy(chstr,orstr);
sort(chstr,chstr+strlen(chstr));
}
DIC operator =(char str[])
{
strcpy(orstr,str);
change();
return *this;
}
bool operator ==(char str[])
{
sort(str,str+strlen(str));
if (strcmp(chstr,str)==0)
return true;
return false;
}
}dic;
bool cmp(DIC a,DIC b);
bool cmp(DIC a,DIC b)
{
return strcmp(b.orstr,a.orstr);
}
dic mydic[MAXNU];
char IN[MAXN];
int main()
{
//freopen("in.txt","r",stdin);
int l = 0;
while(scanf("%s",IN),strcmp(IN,"******")!=0)
{
mydic[l++] = IN;
}
sort(mydic,mydic+l,cmp);
while(scanf("%s",IN)!=EOF)
{
bool fir = 1;
for(int i = 0;i < l;i++)
{
if (mydic[i] == IN)
{
if (fir)
{
fir = 0;
printf("%s",mydic[i].orstr);
}
else
printf(" %s",mydic[i].orstr);
}
}
if (!fir)
printf("\n");
else
printf(":(\n");
}
return 0;
}