在做这个题目之前,我们先要熟悉map的用法。
#include <bits/stdc++.h>
using namespace std;
int main() {
map<int, int>a; //创建一个以int为下标,int为值的map容器
map<string, int>b;
a[0] = 0;
a[1] = 1;
b["abc"] = 1;
b["bc"] = 2;
//map和set一样也不能用下标法遍历
//第一种遍历方式:
for (map<string, int>::iterator it = b.begin(); it != b.end(); it++)
cout << it->first << ' ' << it->second << '\n';
cout << '\n';
//第二种遍历方式:
for (auto i = b.begin(); i != b.end(); i++)
cout << i->first << ' ' << i->second << '\n';
return 0;
}
map与set都支持insert、count,map,还可以使用“[]”,使得它可以像数组一样使用。
问题:
输入一些单词,找出所有满足以下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。
在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中的大小写,按字典序进行排列(所有大写字母在所有小写字母的前面)。
输入:
ladder came tape soon leader acme RIDE lone Dreis peat ScAlE orb eye Rides dealer NotE derail LaCeS drIed noel dire Disk mace Rob dries
#
输出:
Disk
NotE
derail
drIed
eye
ladder
以下代码是在我看完紫书题解后略微修改之后得到的,还请大佬指正!
#include <bits/stdc++.h>
using namespace std;
map<string,int> cnt;
vector<string> words;//第一个string类型的vector容器,用来保存不进行初始化的字符串;
vector<string> ans;//第二个string类型的vector容器,用来储存满足题目要求的字符串;
//初始化输入的字符串,使每个字符串中的字母不分大小写并且排好序
string init(const string&a)
{
string b=a;
for(int i=0;i<b.size();i++)
b[i]=tolower(b[i]);
sort(b.begin(),b.end());
return b;
}
int main()
{
string s;
while(cin>>s)
{
if(s[0]=='#') break;
words.push_back(s);
string c=init(s);
if(!cnt.count(c)) cnt[c]++;//如果在map中不存在该字符串,自增1;
else cnt[c]++;//如果找到了,也自增1;
}
for(int i=0;i<words.size();i++)
if(cnt[init(words[i])]==1) ans.push_back(words[i]);//只出现一次的单词,将它放入第二个vector容器中;
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++) cout<<ans[i]<<'\n';
return 0;
}