我是靠谱客的博主 冷艳香氛,最近开发中收集的这篇文章主要介绍例题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;
}

最后

以上就是冷艳香氛为你收集整理的例题5-4 反片语 map的全部内容,希望文章能够帮你解决例题5-4 反片语 map所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部