寻找变位词

76 篇文章 0 订阅
8 篇文章 0 订阅

转自编程珠玑(五):寻找变位词


1.问题描述

今天的问题是关于变位词的,首先来看问题的描述:

 

给定一本英语单词词典,请找出所有的变位词集。

 

所谓的变位词是指,组成各个单词的字母完全相同,只是字母排列的顺序不同

比如,pots、stop、tops就是变位词。

2.解决思路

  • 思路一
    对组成单词的字母进行组合,针对每一个组合结果在字典中进行匹配。
    不足:组合的结果太多,存在很多无效的组合。
  • 思路二
    针对每个单词和字典中其他的单词进行比较:先比较单词的长度,长度相同后比较组成字母是否相同。
    不足:比较的次数还是太多。
  • 书中的思路
    对每个单词进行签名(以字母顺序进行排序),这样变位词将具有相同的签名。输出签名相同的单词,就得到了要求的变位词。

3.实现思路

将变位词程序组织成三段式的“管道”结构,前一个程序的输出文件将是下一个程序的输入文件。三段程序如下:

  1. sign:读入字典文件,对单词进行“签名”操作
  2. sort:输入签名后的单词文件,对文件进行排序
  3. squash:将同一个变位词类中的各个单词放到同一行中

下面是对具有六个单词的词典进行操作的流程:

pans                                  anps  pans                                  anps  pans
pots                                  opst   pots                                  anps  snap                                 pans  snap
opt           --》 签名  --》     opt    opt             --》 排序  --》   opt    opt              --》挤压 --》        opt
snap                                  anps  snap                                  opst   pots                                 pots  stop   tops
stop                                  opst   stop                                  opst   stop
tops                                  opst   tops                                  opst   tops

4.代码实现

  1. sign程序
    代码如下:
    复制代码
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define WORDMAX 100
    
    int charcomp(const void *x, const void *y)
    {  
        return *(char *)x - *(char *)y;
    }
    
    int main()
    {   
        char word[WORDMAX], sig[WORDMAX];
        while (scanf("%s", word) != EOF) 
        {
            strcpy(sig, word);
            qsort(sig, strlen(sig), sizeof(char), charcomp);
            printf("%s %s\n", sig, word);
        }
        return 0;
    }
    复制代码
  2. sort程序
    排序程序直接使用系统的sort程序。

  3. squash程序
    挤压程序代码如下:

    复制代码
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define WORDMAX 100
    
    int main()
    {   
        char word[WORDMAX], sig[WORDMAX], oldsig[WORDMAX];
        int linenum = 0;
        strcpy(oldsig, "");
        while (scanf("%s %s", sig, word) != EOF) 
        {
            if (strcmp(oldsig, sig) != 0 && linenum > 0)
                printf("\n");
            strcpy(oldsig, sig);
            linenum++;
            printf("%s ", word);
        }
        printf("\n");
        return 0;
    }
    复制代码

5.代码运行

将以上程序编译成可执行程序后,放到同一目录下(同时将测试测试字典文件拷贝到该目录)。

命令行下(windows下,运行cmd)执行如下命令运行程序:

 

sign < dictionary | sort | squash >gramlist.txt

 

我在网上找了一个一万五千个的单词文件,放在这里供测试:dictionary

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值