156 - Ananagrams

本文介绍了一种通过排序和映射方法解决Ananagrams问题的算法。该算法使用C++实现,通过转换所有输入单词为小写并排序,然后利用map存储标准化后的单词及其原始形式,从而快速判断哪些单词不是anagram。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

156 - Ananagrams

    






















题意:由相同字母组成(忽略大小写),只是顺序不同的单词称为anagram,而题目就是要找出给定文本中不是anagram的单词。

思路:判断是否为anagram可以先将单词全部转成小写字母,并用库函数sort(algorithm头文件中)对其排序得到一个字母序递增的单词,称其为标准单词,则只要任意两个单词的标准单词相同,即他们是anagram。

虽然判断时忽略了大小写,但是输出时是区分大小写的,此时可以用map来建立标准单词与原单词的关系,以标准单词做为键,原单词作为值。此时判断是否为anagram就可以调用map的成员函数count(key);count(key)返回指定键值在map中的数量,由于map的键值唯一,所以对于map而言count只返回0或1.

而按照词典序输出,可直接将单词保存到set中(利用set集合有序的属性,对于字符而言是字典序有序

代码:

#include<iostream>
#include<map>
#include<set>
#include<string>
#include<algorithm>
using namespace std;
int main(void) {
	string s,ss;
	multimap<string, string>mp;
	set<string>se;
	while (cin>>s){
		if (s[0] == '#') break;
		int n = s.size();
		ss = s;
		for (int i = 0; i < n; i++)
			if (isupper(ss[i]))
				ss[i]=tolower(ss[i]);
		sort(ss.begin(),ss.end());
		mp.insert(make_pair(ss, s));
	}
	
	for (map<string, string>::iterator it = mp.begin(); it != mp.end(); it++)
		if (mp.count(it->first) == 1)
			se.insert(it->second);
	for (set<string>::iterator it = se.begin(); it != se.end(); it++)
		cout << *it << endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值