输入一些单词,照初所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。在判断是否满足条件时,字母不分大小写,但在输出时应保留输入中的大小写,按字典序进行排序(所有大写字母在所有小写字母的前面)
来源:反片语(Ananagrams,Uva 156)
先说一句,我不是按照原题的输入样例写的,只是完成了上述的相应的功能
我map是上网学的(或许我应该去看我那本C++ Primer Plus),发现网上基本上都没说使用迭代器的时候,迭代器访问的顺序
在了解到map可以用迭代器后,我就产生了这个疑问,然后自己去试了下,发现他是把key值排序之后进行访问的(就是用[]访问的时候,[]里面的那个)然后心中一喜,那我不是不用自己排序?
最后发现不是这样的,因为我key值是标准化后的字符串:字符串全部转化为小写,然后按字典序排序
最后是把符合标准的字符串取出来放在vector里面,然后用sort函数排序的
代码如下:
#include<map>
#include<vector>
#include<cctype>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
string getWord(void);
void s_tolower(string &str1, string &str2);
map<string, vector<string>> dictionary;
vector<string> result;
int main(void)
{
//输入并处理
while(true)
{
string s_tmp1 = getWord(), s_tmp2;
s_tolower(s_tmp1, s_tmp2);
if(s_tmp1.empty()) break;
auto it = dictionary.find(s_tmp2);
if(it == dictionary.end())
{
vector<string> tmp;
tmp.push_back(s_tmp1);
dictionary[s_tmp2] = tmp;
}
else
it->second.push_back(s_tmp1);
}
//去除不满足条件的字符串并对结果排序
for(auto it = dictionary.begin(); it != dictionary.end(); it++)
if(it->second.size() == 1)
result.push_back(it->second[0]);
sort(result.begin(), result.end());
//输出
for(auto it = result.begin(); it != result.end(); it++)
printf("%s\n", (*it).c_str());
return 0;
}
string getWord(void)
{
char c;
string str;
while(!isalpha(c = getchar()))
if(c == EOF) return str;
do
{
str.push_back(c);
}while(isalpha(c = getchar()));
ungetc(c, stdin);
return str;
}
void s_tolower(string &str1, string &str2)
{
for(int i = 0; i < str1.size(); i++)
str2.push_back(tolower(str1[i]));
sort(str2.begin(), str2.end());
return;
}