您的位置:首页 > 其它

寻找变位词

2014-10-14 14:18 162 查看
转自编程珠玑(五):寻找变位词


1.问题描述

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



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


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

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


2.解决思路

思路一

对组成单词的字母进行组合,针对每一个组合结果在字典中进行匹配。

不足:组合的结果太多,存在很多无效的组合。
思路二

针对每个单词和字典中其他的单词进行比较:先比较单词的长度,长度相同后比较组成字母是否相同。

不足:比较的次数还是太多。
书中的思路

对每个单词进行签名(以字母顺序进行排序),这样变位词将具有相同的签名。输出签名相同的单词,就得到了要求的变位词。


3.实现思路

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

sign:读入字典文件,对单词进行“签名”操作
sort:输入签名后的单词文件,对文件进行排序
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.代码实现

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;
}




sort程序

排序程序直接使用系统的sort程序。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: