习题 5-4 反片语(Ananagrams)UVa 156
2017-08-25 21:51
316 查看
题目大意:
输入一些单词,找出满足如下规则的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。判断时候字母不区分大小写,但是输出时候应该保留输入时候的大小写,并且按照字典序进行排序(大写字母排在小写字母前面)。
实现1:(用数组模拟)
实现2:(用map,vector)
注意:(2)中用到了sort 对 string 类型数据进行排序 还有 对string 数据内部的字符串进行排序
不同于普通字符串sort(a,a+n) 而是sort(a.begin(), a.end());
输入一些单词,找出满足如下规则的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。判断时候字母不区分大小写,但是输出时候应该保留输入时候的大小写,并且按照字典序进行排序(大写字母排在小写字母前面)。
实现1:(用数组模拟)
#include<set> #include<iostream> #include<map> #include<algorithm> #include<cstring> #define maxn 1000 using namespace std; struct Str{ char low[100];//保存小写单词 char str[100];//原单词 bool flag;//标记是否满足条件 }s[maxn]; struct R{ char s[100]; }r[maxn];//保存满足条件的单词 int cmp(R a, R b) { return strcmp(a.s, b.s) < 0; } int main() { // freopen("C:\\Users\\zhangwei\\Desktop\\input.txt","r",stdin); int count = 0; while(cin >> s[count].str){ if(s[count].str[0] == '#') break; for(int i = 0; i < strlen(s[count].str); i++ ){ s[count].low[i] = tolower(s[count].str[i]); } sort(s[count].low, s[count].low+strlen(s[count].str));//关键 s[count].flag = true; count++; } for(int i = 0; i < count; i++ ){//所有单词进行两两比较 for(int j = i+1; j < count; j++ ){ if(strcmp(s[i].low,s[j].low) == 0){ s[i].flag = false; s[j].flag = false; } } } int cnt = 0; for(int i = 0; i < count ; i++ ){ if(s[i].flag == true){//保存满足条件的单词 strcpy(r[cnt++].s, s[i].str); } } sort(r, r+cnt, cmp);//按照字典序排序 for(int i = 0; i < cnt; i++ ){ cout << r[i].s <<endl; } return 0; }
实现2:(用map,vector)
#include<set> #include<iostream> #include<map> #include<algorithm> #include<cstring> #include<vector> using namespace std; string repr(const string &s) { string tmp = s; for(int i = 0; i < s.length(); i++ ){ tmp[i] = tolower(s[i]); } sort(tmp.begin(),tmp.end());//关键 return tmp; } vector<string> words; map<string,int> cnt;//键值对 int main() { // freopen("C:\\Users\\zhangwei\\Desktop\\input.txt","r",stdin); string s; string tmp; while(cin >> s){ if(s[0] == '#') break; words.push_back(s); tmp = repr(s); ++cnt[tmp]; } vector<string> ans; for(int i = 0; i < words.size(); i++ ){ if(cnt[repr(words[i])] == 1){ ans.push_back(words[i]); } } vector<string>::iterator it; sort(ans.begin(),ans.end());//默认字典序 for(it = ans.begin(); it != ans.end(); it++ ){ cout << *it <<endl; } return 0; }
注意:(2)中用到了sort 对 string 类型数据进行排序 还有 对string 数据内部的字符串进行排序
不同于普通字符串sort(a,a+n) 而是sort(a.begin(), a.end());
相关文章推荐
- UVA -156 Ananagrams(反片语)
- 经典第五章 例 5-4 UVA 156 Ananagrams(反片语)【map的应用】
- UVA-156 Ananagrams
- UVa-156-Ananagrams
- UVA 156(p113)----Ananagrams
- UVa156 - Ananagrams
- uva 156 - Ananagrams
- UVa 156 反片语
- UVA156 - Ananagrams
- uva 156 - Ananagrams(排序水题)
- Uva 上自己AC 的题目1 156 - Ananagrams
- Uva 156 - Ananagrams
- UVa-156-Ananagrams
- STL语法——映射:map 反片语(Ananagrams,UVa 156)
- UVA156 - Ananagrams(同白皮书的例子:字母重排)
- uva 156 Ananagrams(检索+sort排序)
- UVA - 156 Ananagrams
- UVa156 Ananagrams
- 【UVa】[156]Ananagrams
- UVA 156 Ananagrams (字符串模拟)