变位词--【编程珠玑】

本文深入探讨《编程珠玑》中关于变位词(anagram)的处理方法,通过签名、排序和挤压三个阶段的程序实现。文章介绍了如何使用这些程序对单词进行字母排序和归类,以找出所有可能的变位词组合,并提供了一个实际操作的示例,邀请读者亲自尝试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重拾《编程珠玑》,再看一遍,之前未仔细看的或是忽略的,希望这次能有更丰富的收获;

好,如题,变位词:一种把某个词或句子的字母的位置(顺序)加以改换所形成的新词,英文叫做anagram,词典把这个词翻译成“变位词”。

书中将这个程序按三个阶段的“管道”组织,其中一个程序的输出文件作为下一个程序的输入文件。第一类程序标识单词,第二个程序排序标识后的文件,而第三个程序将这些单词压缩为每个变位词类一行的形式。


其中签名,排序,挤压(这翻译的...)即为sign,sort,squash
sign程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define WORDMAX 100

int charcomp(char *x, char *y)
{
    return *x - *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;
}
三个程序的功能:

sigh程序是将每个单词按照字母a-z进行排序,并将其放置前面,如pans,按字母排序即为anps,故而但是pans的sign为anps pans;

sort程序即是将类如anps pans进行排序;

squash程序即是来找到变位词,在同一行输出;

这里还有另外一个问题,我们发现sign程序和squash程序都是在main里面的,和我们一般的程序运行不同,所以说书中的程序按照三个阶段的“管道”组织(有读者朋友说是作者没考虑清楚,其实这是错怪了);

我们将sign和squash的执行文件与目标的字典放在一个文件夹里;

如我们将其放在一文件夹中,放在D盘中:


这时 运行 -> cmd -> 到目标文件夹 -> sign <dictionary.txt | sort | squash >gramlist.txt


这两个txt文件中内容与第一幅截图中的头尾两个图类似:


当然若是有一个更大的dictionary来测试那就更好,可以找到整本字典的变位词;


大家有兴趣不妨试试,O(∩_∩)O





评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值