算法竞赛入门经典(第二版) | 例题5-3 安迪的第一个字典 (紫书牛啤!)(UVa10815,Andy's First Dictionary)
概述:
輸入一個文本,找出所有不同的單詞,按字典序排序,去重后,輸出,單詞不分大小寫。
儲備知識:
1、sstring頭文件的用法→sstring頭文件函數(shù)詳解
2、cctype頭文件的用法→cctype頭文件函數(shù)詳解
題目(提交)鏈接→UVa-10815
沒使用過該網(wǎng)站的同學(xué)請猛戳這里→vJudge教程
分析
一、我的思路是:
讀到大寫字母就轉(zhuǎn)化成小寫的,讀到小寫就存入字符串s,讀到非字母就代表這個單詞結(jié)束了, 將串壓入set集合,清空串,循環(huán)進行。值得注意的一點是:串的長度為0,也是串,叫做“空串”。也會被壓入set。所以壓入前要判斷一下長度是否為0.為什么會有這種弱智的設(shè)定。。。。由于每次都要判斷長度,時間復(fù)雜度提升,顯然不是最優(yōu)解,代碼會貼出來供大家參考。
二、劉先生的思路是:
將大寫字母轉(zhuǎn)為小寫,將除字母外所有字符轉(zhuǎn)化為空格,最后用stringstream以空格為分界做轉(zhuǎn)化。
我的代碼:
#include<iostream> #include<cctype> #include<set> using namespace std; int main() {string s;char ch;set<string> s1;while((ch = getchar()) != EOF) {if(isupper(ch)) ch = tolower(ch);if(islower(ch)) s += ch;else { if(s.length() != 0) { s1.insert(s); s.clear(); }}}set<string>::iterator it;for(it = s1.begin(); it != s1.end(); it++) //set中第一個值是ctrl+z后的那個回車。 cout << *it << endl; return 0;}劉先生的代碼:
#include<iostream> #include<string> #include<set> #include<sstream> using namespace std;set<string> dict;int main() {string s, buf;while(cin >> s) {for(int i = 0; i < s.length(); i++)if(isalpha(s[i])) s[i] = tolower(s[i]); else s[i] = ' ';stringstream ss(s); //將s裝入ss while(ss >> buf) dict.insert(buf); }for(set<string>::iterator it = dict.begin(); it != dict.end(); ++it) cout << *it << '\n';return 0; }收獲:
1、字符串長度為0,也是字符串,叫做“空串”
2、z的阿斯克碼值等于122
3、鞏固了cctype的知識
4、學(xué)習(xí)了stringstream的新用法
總結(jié)
以上是生活随笔為你收集整理的算法竞赛入门经典(第二版) | 例题5-3 安迪的第一个字典 (紫书牛啤!)(UVa10815,Andy's First Dictionary)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简洁明了——STL容器库之set头文件常
- 下一篇: 简介明了——map+multimap头文