给定一个单词集合,找出可以相互转换的集合。比如abc bca cba都可以相互转换(变位词)

算法如下:单词按照字母进行排序,单词间进行排序,这样相同标识的单词聚集到一起

这里用C++来写了。 

     这里主要是用到了map关联容器。因为对于每一个单词的标识就相当于是一个键,而单词本身就相当于是值。所以这是很明显的map容器。然后就是map容器可以使用下标操作访问。使用下标操作访问map容器与使用下标操作访问数组或者是vector的行为截然不同,用下标访问不存在的元素的时候将导致在map容器中添加一个新的元素,它的键就是该下标值。

     对map迭代器进行解引用时,讲产生一个pair类型的对象,它的first成员存放键而且是const,它的second成员存放值。例如map<string,int>::iterator iter.如果要访问键值和值那么同pair类型一样。iter->first访问键值,iter->second访问具体值。

     对于程序中用到的点操作符和箭头操作符的区别作下面的说明:

通俗的说就是:c++中当定义类对象是指针对象时候,就需要用到->指向类中的成员;当定义一般对象时候时就需要用到"."指向类中的成员

箭头操作符左边是指针,点操作符左边是实体。如果p是指针,  p->function();   如果p是对象,  p.function();

记住-〉必须是指针,点操作符左边必须是对象或者结构体,一般是类对象

比如:容器的迭代器iter。iter->function() = (*iter).function();

          结构体:结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型。第二,相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同。

定义结构体使用struct 修饰符,例如:
C++ 代码
struct test
{
float a;
int b;
};

  1. void gen_label(vector<string> &dict, map<string, vector<string> >&rec)    
  2. {    
  3.     for (int i = 0; i < dict.size(); ++i)    
  4.     {    
  5.         string line = dict[i];    
  6.         sort(line.begin(), line.end()); //对单词中的字母进行排序,排序后的结果就作为标识,如果是变位词那么排序后有相同标识   
  7.         rec[line].push_back(dict[i]); 
  8.     }     //对于单词也进行排序,这里的排序是因为当某个键不存在时,map容器会插入这个新的键,而且是按照字典顺序排序的,所以这里map容器会           //自动的把键的顺序排好,这里就实现了把标志的排序。并且把同样标志的词放入到一个map容器中
  9.   
  10.     
  11.     for (map<string, vector<string> >::iterator iter = rec.begin();iter != rec.end(); ++iter)    
  12.     {    
  13.         cout<<iter->first<<":"; //输出单词的标志
  14.         for(vector<string>::iterator itervec=iter->second.begin();itervec<iter->second.end();itervec++)
  15.             cout<<*itervec<<" "  
  16.         cout << endl;    
  17.     }    
  18. }    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值