開啟章節選單
10815 Andy’s First Dictionary
題目連結
題目敘述
八歲的安迪有個夢想──他想要自己做一本字典
但對他來說,這並不簡單,因為他知道的單詞還不夠多
於是他想到了一個好辦法:從他書架上挑出一本最喜歡的故事書
將其中所有不重複的單詞抄下來,再把它們按字母順序排列即可!
當然,這是一件非常耗時的工作,這時候就需要電腦程式的幫助
單詞定義
- 單詞定義為一段連續的英文字母(可包含大寫和/或小寫),單個字母也算作單詞。
- 程式必須對大小寫不敏感,例如 “Apple”、 “apple” 以及 “APPLE” 都視為同一個單詞。
輸入格式
- 一段文字,最多不超過 5000 行,每行至多 200 個字元。
- 以檔案結尾(EOF)為輸入結束標誌。
輸出格式
- 輸出所有在輸入文字中出現過的不同單詞,每行一個。
- 單詞請全部以小寫列出,並依字母序排序。
- 你可以確定不同單詞的總數不會超過 5000 個。
解題思路
先遍歷字串,將若字母的字元就轉為小寫、否則則轉為空白
使用 stringstream 來將字串分割為各個單字
將單字放入字串 set 中,儲存的同時達到排序和去重
最後遍歷 set 進行輸出
程式碼
#include <bits/stdc++.h> using namespace std; int main() { string s; set<string> st; // 初始化儲存單字的集合 st while (cin >> s) { for (auto &c : s) { // 遍歷字串中所有的字元 if (isalpha(c)) c = tolower(c); // 若為該字元為字母,將其轉為小寫 else c = ' '; // 將非字母的字元修改成空格 } stringstream ss(s); // 將字串導入 stringstream 中 while (ss >> s) st.insert(s); // 將整行句子分隔成各個單字,並存進集合 st 中 } for (auto s : st) cout << s << '\n'; // 遍歷輸出集合中已經排序好的單字 }