概述
题目:反片语
映射:map
算法竞赛入门经典第二版 刘汝佳 P113例题5-4
思路:
- 将每个输入的单词 “标准化” :
都转化为小写字母
单词里的字母都按字典序重新排列 - 遍历所有 “标准化” 后的单词,统计相同的单词的个数,将个数为1的单词输出
涉及知识点:
- 不定长数组 vector:
输入的单词个数未知,故用不定长数组vector存储 - 映射 map :
也称为 “关联数组”,本题中 cnt [string] 存储的是 字符串string的个数 - cnt.count (键值):
返回1或0,代表是否存在键值。返回0不存在键值,返回1存在返回1或0,代表是否存在键值。返回0不存在键值,返回1存在 - 函数 tolower() :
字母字符转换成小写,非字母字符不做处理 字母字符转换成小写,非字母字符不做处理 - 函数 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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复