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'; // 遍歷輸出集合中已經排序好的單字
}