• 寻找变位词


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


    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
      ", 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("
      ");
              strcpy(oldsig, sig);
              linenum++;
              printf("%s ", word);
          }
          printf("
      ");
          return 0;
      }
      复制代码

    5.代码运行

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

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

     

    sign < dictionary | sort | squash >gramlist.txt

     

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

  • 相关阅读:
    [转载]网站运营粮草要先行
    微信公众平台开发(一) 配置接口
    UI框架说明
    布局
    DataGrid表格控件
    Dialog控件
    mysql出现 too many connections
    JVM调优案例
    ArrayBlockingQueue源码阅读
    jdk命令行工具
  • 原文地址:https://www.cnblogs.com/noble/p/4144026.html
Copyright © 2020-2023  润新知