POJ 1318 && HDU 1113 Word Amalgamation(水~)

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值