其他分享
首页 > 其他分享> > uva156反片语

uva156反片语

作者:互联网

预备知识

字典序排序时大写都比小写小

map<Key类型,value类型>m;//m.count(key)返回值为1或0,表示这个key是否存在于map中。

sort()可以对string数组字典序排序,也可以对string对象进行元素遍历排序。

题目

输入文本,找出如下单词并按字典序输出:单词不能通过字母重排得到文本中的其它单词(不区分大小写)。输出时保留原单词的大小写。

思路及代码

/*1.对输入的单词全部转换为小写,再按照字典序排序。得到标准化后的单词,此时单词不与其他单词严格重复则为有效单词。
* 2.标准化后的单词判断是否严格重复:map<单词,出现次数>
* 3.输出原格式的单词:因此必须保留所有原输入单词,输出时遍历原单词数组判断其标准化单词在map中的value是否为1.
* 为1则push到输出队列。输出队列升序后即可输出。
*/
//原单词数组
vector<string>words;
//判断标准化后是否有重复
map<string, int>cnt;
//输出要升序输出
vector<string>ans;
string repr(const string& s)
{
	string ans = s;
	for (int i = 0;i < ans.length();i++)
		ans[i] = tolower(ans[i]);
	sort(ans.begin(), ans.end());//string对象的成员函数begin()和end()
	return ans;
};
int main()
{
//处理原单词数组和单词标准化后出现次数
	string s;
	while (cin >> s)
	{
		if (s[0] == '#')break;
		words.push_back(s);
		string r = repr(s);
		if (!cnt.count(r))cnt[r] = 0;//把标准化单词放入map
		++cnt[r];
	};
//判断是否有重复,没有就排序后输出
	for (int i = 0;i < words.size();++i)
		if (cnt[words[i]] == 1)ans.push_back(words[i]);
	//sort(ans, ans+ans.size());
	sort(ans.begin(),ans.end());//vector数组的成员函数begin(),end()
	for (int i = 0;i < ans.size();++i)cout << ans[i]<<endl;
};

  

标签:输出,string,uva156,标准化,单词,words,ans,片语
来源: https://www.cnblogs.com/xiao-wang-zi/p/13927662.html