Description
先给定n个字符串形成一个字典库,然后再给你任意一个字符串,问你这个字符串经过字符随意组合能形成多少个字典库里面匹配的字符串
Input
先输入字典库,以XXXXXX结束字典输入,然后给出多个查询字符串,同样以XXXXXX结束输入
Output
对于每个查询字符串,输出字典中能由其自由组合形成的所有字符串,若不存在则输出NOT A VALID WORD
Sample Input
tarp
given
score
refund
only
trap
work
earn
course
pepper
part
XXXXXX
resco
nfudre
aptr
sett
oresuc
XXXXXX
**
**
score
∗∗∗∗∗∗
refund
∗∗∗∗∗∗
part
tarp
trap
∗∗∗∗∗∗
NOT A VALID WORD
∗∗∗∗∗∗
course
∗∗∗∗∗∗
Solution
先将字典复制,将复制版中每个字符串按字典序排列,对于每个查询字符串,同样将其按字典序排列,这样将其排列后的字符串与复制版字典比较,如果完全相同则输出原版字典对应字符串即可。
注意:因为多组可行解要按字典序输出,所以先将字典排序
Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 100
int compare (const void *a ,const void *b)
{
return (strcmp((char *)a,(char *)b));
}
int cmp_char(const void *a,const void *b)
{
return ((char*)a)[0]-((char*)b)[0];
}
int main()
{
char dict[MAX_N][7],s[7],t[7];
int n=0,i,len,size,flag;
while(1)
{
scanf("%s",dict[n]);
if(strcmp(dict[n++],"XXXXXX")==0)//结束字典输入
break;
}
qsort(dict[0],n-1,sizeof(dict[0]),compare);//将字典排序
while(1)
{
scanf("%s",s);
if(strcmp(s,"XXXXXX")==0)//结束查询
break;
len=strlen(s);
qsort(s,len,sizeof(char),cmp_char);//将查询字符串排成字典序
flag=0;
for(i=0;i<n-1;i++)//遍历字典
{
size=strlen(dict[i]);
if(size==len)
{
strcpy(t,dict[i]);//从字典中取字符串
qsort(t,size,sizeof(char),cmp_char);//将字典中字符串排成字典序
if(strcmp(s,t)==0)//找到匹配,标志变量取1
{
flag=1;
printf("%s\n",dict[i]);
}
}
}
if(!flag)//没有匹配,按格式输出
printf("NOT A VALID WORD\n");
printf("******\n");//按格式输出
}
return 0;
}