//set是一个排序后的容器,该容器不容许重复.
//map用来存储排序后的键值对,键必须唯一.
//set和map支持在最坏情况下对基本操作insert,erase和find仅消耗对数时间.
//相应的底层实现是平衡二叉树.典型的用法不是使用AVL树,而常常是使用自顶向下的红黑树.
//set和map的每一个元素都是一个pair的实例.
1 #include<iostream>
2 #include<fstream>
3 #include<map>
4 #include<string>
5 #include<vector>
6 #include<set>
7  using namespace std;
8
9  //根据一篇英文文档构建词典
10  set<string> buildDicFromDoc(string file){
11 set<string> dic;
12 ifstream infile(file.c_str());    //由于历史原因,IO标准库使用C风格的字符串而不是C++ string类型的字符串
13 if(!infile)
14 return dic;
15 string word="";
16 while(infile>>word)
17 dic.insert(word);
18 return dic;
19 }
20
21  //从字典中寻找只有一个字母不同的单词
22  map<string,vector<string> > computeAdjacentWords(const vector<string>& words){
23 map<string,vector<string> > adjWords;
24 map<int,vector<string> > wordsByLength;
25 //按长度对单词进行分组
26 for(int i=0;i<words.size();i++)
27 wordsByLength[words[i].length()].push_back(words[i]);
28 //分别对每一组进行操作
29 map<int,vector<string> >::const_iterator itr;
30 for(itr=wordsByLength.begin();itr!=wordsByLength.end();++itr){
31 const vector<string> & groupsWords=itr->second;
32 int groupNum=itr->first;
33
34 //对同一组单词上的每个位置进行操作
35 for(int i=0;i<groupNum;i++){
36 //擦掉第i个位置上的字母,其余部分相同的单词放入同一个map
37 map<string,vector<string> > repToWord;
38 for(int j=0;j<groupsWords.size();j++){
39 string rep=groupsWords[j];
40 rep.erase(i,1);
41 repToWord[rep].push_back(groupsWords[j]);
42 }
43
44 //查找相近的单词
45 map<string,vector<string> >::const_iterator itr2;
46 for(itr2=repToWord.begin();itr2!=repToWord.end();++itr2){
47 const vector<string> & clique=itr2->second;
48 if(clique.size()>=2)
49 for(int p=0;p<clique.size();p++)
50 for(int q=p+1;q<clique.size();q++){
51 adjWords[clique[p]].push_back(clique[q]);
52 adjWords[clique[q]].push_back(clique[p]);
53 }
54 }
55 }
56 }
57 return adjWords;
58 }
59
60 //打印相近单词
61 void printHighChangeables(const map<string,vector<string> > & adjWords,int minWords=15){
62 map<string,vector<string> >::const_iterator itr;
63 for(itr=adjWords.begin();itr!=adjWords.end();++itr){
64 const pair<string,vector<string> > & entry=*itr;
65 const vector<string> & words=entry.second;
66
67 if(words.size()>=minWords){
68 cout<<entry.first<<"("<<words.size()<<")";
69 for(int i=0;i<words.size();i++)
70 cout<<" "<<words[i];
71 cout<<endl;
72 }
73 }
74 }
75
76 int main(){
77 vector<string> dic;
78 set<string> temp=buildDicFromDoc("doc_en.txt");
79 set<string>::const_iterator itr;
80 for(itr=temp.begin();itr!=temp.end();++itr)
81 dic.push_back(*itr);
82 const map<string,vector<string> > & adjWords=computeAdjacentWords(dic);
83 printHighChangeables(adjWords,2);
84
85 return 0;
86 }
87

D:\C++>AdjacentWords.exe

bike(2)  like  bile

fine(4)  line  mine  pine  wine

like(2)  bike  line

line(5)  fine  mine  pine  wine  like

mine(4)  fine  line  pine  wine

pine(4)  fine  line  mine  wine

wide(3)  wine  wipe  wire

wine(10)  fine  line  mine  pine  wide  wipe  wire  wing  wink  wins

wing(3)  wine  wink  wins

wink(3)  wine  wing  wins

wins(3)  wine  wing  wink

wipe(3)  wide  wine  wire

wire(3)  wide  wine  wipe

查找只有一个字母不相同的单词相关推荐

  1. 如何设置单词第一个字母大写_大写一行中每个单词的第一个和最后一个字母

    如何设置单词第一个字母大写 Problem statement: 问题陈述: Given an input line, capitalize first and last letter of each ...

  2. python查找单词列表中相同字母组成的不同单词

    单词列表的链接:words.txt 列表中一共有11.3万个单词,.txt文件格式,是一个很好的素材库. 问题:如何在单词表中,查找相同字母组成的不同单词? 输出结果的例子: ['aals', 'al ...

  3. 给定两个有着相同长度且都在字典内的单词,要求写一个方法来把一个单词变型成另一个单词。 一次只能转换一个字母,且每次生成的单词必须在字典内...

    2019独角兽企业重金招聘Python工程师标准>>> EXAMPLE Input: DAMP, LIKE Output: DAMP -> LAMP -> LIMP -& ...

  4. 2022-11-10:写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率。 为了简单起见,你可以假设: words.txt只包括小写字母和 ‘ ‘ 。 每个单词只由小写

    2022-11-10:写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率. 为了简单起见,你可以假设: words.txt只包括小写字母和 ' ' . 每个单词只由小写 ...

  5. 在一连串英语单词中输出每个英语单词最后一个字母

    今天写了个能在输入一连串用空格隔开的英语单词中把每个英语单词的最后一个字母的代码,写个博客再理一理思路. 这个代码要用到字符分割函数(strtok)所以要包含string这个头文件. 首先创建一个能容 ...

  6. java设有一个由10个英文单词构成的字符串数组,要求:(1)统计以字母 w 开头的单词数;(2)统计单词中含“or”字符串的单词数;(3)统计长度为 3 的单词数。

    大学学习之java篇 题目:设有一个由10个英文单词构成的字符串数组,要求:(1)统计以字母 w 开头的单词数:(2)统计单词中含"or"字符串的单词数:(3)统计长度为 3 的单 ...

  7. 【2012年华为校园招聘软开上机-成都】字母转换、统计单词个数

    2013-09-11 15:18:51 1 字串转换 问题描述: 将输入的字符串(字符串仅包含小写字母'a'到'z'),按照如下规则,循环转换后输出:a->b,b->c,-,y->z ...

  8. LeetCode 2135. 统计追加字母可以获得的单词数(位运算+哈希)

    文章目录 1. 题目 2. 解题 1. 题目 给你两个下标从 0 开始的字符串数组 startWords 和 targetWords .每个字符串都仅由 小写英文字母 组成. 对于 targetWor ...

  9. 贺利坚老师汇编课程37笔记:把六个字符串里的头一个字母改写成大写字母

    指路老师的博客 将datasg段中每个单词的头一个字母改写成大写字母,共六个字符串 像是某个软件的菜单 assume cs:codesg,ds:datasg datasg segmentdb '1. ...

最新文章

  1. gevent.joinall()开启协程
  2. 消除代码中的坏味道,编写高质量代码
  3. ebp 函数堆栈esp_函数堆栈调用过程
  4. 869. 重新排序得到 2 的幂
  5. 小森生活显示无可用服务器,《小森生活》无可用游戏服务器解决教程 无可用网关服务器怎么办...
  6. LeetCode 171 Excel Sheet Column Number
  7. 作者:周园春(1975-),男,中国科学院计算机网络信息中心研究员、博士生导师...
  8. manjaro软件源报错 不停看到错误 “PackageName: signature from “User <email@archlinux.org>“ is invalid“ 的几种解决方法
  9. JavaScript中的对象学习笔记(属性操作)
  10. spring框架Annotation之CRUD
  11. eclipse项目的导入
  12. delphi2007 注册码
  13. 抖音企业号无需开发连接第三方系统
  14. Android Timer和TimerTask解决IllegalStateException:Task already scheduled or cancelled
  15. 腾讯企业邮箱解析到阿里云域名
  16. 找到一个不错的学习python的网站
  17. CSS基础学习-背景、边框的学习
  18. STM32连YL69土壤湿度传感器以及内部温度传感器采集数据并在LCD上显示
  19. msfvenom——木马免杀篇
  20. RV1109 SPI调试

热门文章

  1. Redis 在CentOS 6上的 安装和部署以及redis的主从复制sentinel实现HA
  2. web从零单排,做一个简单的幻灯片
  3. Alternative PHP Cache ( APC )
  4. + ,- (加号,减号) 是数字类型吗?(sql server 2000中)
  5. gitlab8.2-8.16-8.17-9.0升级
  6. leetcode 24: 两两交换链表中的节点
  7. hpacucli查看HP服务器硬盘状态
  8. Apache - AH00341
  9. IE下使用jquery ajax失效的原因
  10. 重构风险程序员一定要遵守的规则