例题5-4 反片语 map

题目:反片语

映射:map
算法竞赛入门经典第二版 刘汝佳 P113例题5-4
在这里插入图片描述
在这里插入图片描述

思路:

  • 将每个输入的单词 “标准化” :
    都转化为小写字母
    单词里的字母都按字典序重新排列
  • 遍历所有 “标准化” 后的单词,统计相同的单词的个数,将个数为1的单词输出

涉及知识点:

  1. 不定长数组 vector:
    输入的单词个数未知,故用不定长数组vector存储
  2. 映射 map :
    也称为 “关联数组”,本题中 cnt [string] 存储的是 字符串string的个数
  3. cnt.count (键值):
    返回1或0,代表是否存在键值。返回0不存在键值,返回1存在返回1或0,代表是否存在键值。返回0不存在键值,返回1存在
  4. 函数 tolower() :
    字母字符转换成小写,非字母字符不做处理 字母字符转换成小写,非字母字符不做处理
  5. 函数 sort(): 排序

代码:

#include <bits/stdc++.h>
using namespace std;

map<string,int> cnt;//string到int类型的映射 (key到value的映射) 
vector<string> words;//建立不定长数组vector 

//将单词s进行“标准化” 
string repr(const string& s)
{
	string ans=s;
	for(int i=0;i<ans.length();i++)
		ans[i]=tolower(ans[i]);//函数 tolower() 字母字符转换成小写,非字母字符不做处理 
	sort(ans.begin(),ans.end());//algorithm 里的sort()排序函数,排序对象可以存在于普通数组里,也可以存在于vector中 
	return ans;
}

int main()
{
	int n=0;
	string s;
	while(cin>>s)
	{
		if(s[0] == '#')break;//输入#时结束输入 
		words.push_back(s);//vector里的函数 向尾部添加元素 
		string r = repr(s);
		if(!cnt.count(r)) cnt[r]=0;//初始化value都为0,cnt.count()返回0说明不存在value,返回1则存在 
		cnt[r]++;//统计“标准化”之后的单词个数,若为1则说明不能通过字母重排 
	} 
	vector<string> ans;
	for(int i=0;i<words.size();i++)
		if(cnt[repr(words[i])]==1)ans.push_back(words[i]);//该单词不能通过字母重排(value为1)得到输入文本中的另外一个单词 
	sort(ans.begin(),ans.end());//输出时要求按字典序排列,故先排好序再输出 
	for(int i=0;i<ans.size();i++)
		cout<<ans[i]<<"\n";
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42324771/article/details/88082882