STL 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
soon

#include<iostream>
#include<string>
#include<cctype>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
map<string, int> cnt;
vector<string> words;
string repr(const string &s) {
	string ans = s;
	for (int i = 0; i < s.length(); i++)
		ans[i] = tolower(s[i]);
	sort(ans.begin(), ans.end());
	return ans;
}
int main() {
	int n = 0;
	string s;
	while (cin >> s) {
		if (s[0] == '#') break;
		words.push_back(s);
		string r = repr(s);
		if (!cnt.count(r)) cnt[r] = 0;
		cnt[r]++;
	}
	vector<string> ans;
	for (int i = 0; i < words.size(); i++)
		if (cnt[repr(words[i])]==1) ans.push_back(words[i]);
	sort(ans.begin(), ans.end());
	for (int i = 0; i < ans.size(); i++)
		cout << ans[i] << endl;
	system("pause");
	return 0;
	
}

关于cctype中头文件的函数的作用
isalnum() 如果参数是字母数字,即字母或数字,该函数返回true
isalpha() 如果参数是字母,该函数返回真
isblank() 如果参数是空格或水平制表符,该函数返回true
iscntrl() 如果参数是控制字符,该函数返回true
isdigit() 如果参数是数字(0~9),该函数返回true
isgraph() 如果参数是除空格之外的打印字符,该函数返回true
islower() 如果参数是小写字母,该函数返回true
isprint() 如果参数是打印字符(包括空格),该函数返回true
ispunct() 如果参数是标点符号,该函数返回true
isspace() 如果参数是标准空白字符,如空格、进纸、换行符、回车
水平制表符或者垂直制表符,该函数返回true

isupper() 如果参数是大写字母,该函数返回true
isxdigit() 如果参数是十六进制的数字,即0~9、af、AF,该函数返回true
tolower() 如果参数是大写字符,则返回其小写,否则返回该参数
toupper() 如果参数是小写字母,则返回其大写,否则返回该参数
关于map中的一些的用法
begin() 返回指向map头部的迭代器

clear() 删除所有元素

count() 返回指定元素出现的次数

empty() 如果map为空则返回true

end() 返回指向map末尾的迭代器

equal_range() 返回特殊条目的迭代器对

erase() 删除一个元素

find() 查找一个元素

get_allocator() 返回map的配置器

insert() 插入元素

key_comp() 返回比较元素key的函数

lower_bound() 返回键值>=给定元素的第一个位置

max_size() 返回可以容纳的最大元素个数

rbegin() 返回一个指向map尾部的逆向迭代器

rend() 返回一个指向map头部的逆向迭代器

size() 返回map中元素的个数

swap() 交换两个map

upper_bound() 返回键值>给定元素的第一个位置

value_comp() 返回比较元素value的函数
其中该题中的作用时是使用了tolower()函数
关于algorithm头文件的作用:提供了sort()函数对字母进行排序。
题中map的count函数是找到map中是否存在在字符串r如果存在则返回1,否则返回0
该题算法是每次把s放入到words中,把排好序的单词r放入到cnt的键string中如果cnt中存在r字符串则直接cnt[r]自增一次。如果cnt[r]不存在则给他赋值为0并自增一次,一直循环到输入“#”
用for循环找到cnt中string 键中的标准化的单词的个数,如果标准化的单词为1 即就是输入字段中输入的单词中字母字符不一样,这样就不能通过重排的到另外的一个输入的单词。将判断后原单词放入ans中,将其排序输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值