# APCS實作題2018年:最少相異字母 > 日期:2023年9月9日 > 作者:王一哲 > 題目來源:107年10月實作題 > [ZeroJudge 題目連結](https://zerojudge.tw/ShowProblem?problemid=e313) <br /> ## 題目 ### 問題描述 「字串裡面有太多不同的字是不和諧的」,喵喵妮維森這麼說著。因此她想要在 N 個字串中,找出含有最少相異字母的字串,當有多個都是最少相異字母時,則選出字典排序最小者。 舉例來說,對於三個字串 "ABBCAAB"、"AABBACC"、"AAPPCCSS",可以看出各個字串所含有的相異字母數量分別是3、3、4。其中按照字典間互相比較可以得到"ABBCAAB" > "AABBACC",所以最後會得到字串"AABBACC"。 請幫助喵喵維森找出最和諧的字串。 <br /> ### 輸入格式 第一行有一個正整數 N (N ≤ 1000),代表接下來有 N 個字串。 接下來有 N 行,每一行有一個字串,字串內只會含有大寫字母A ~ Z。 <br /> ### 輸出格式 找出 N 個字串內最少相異字母的字串,當有多個字串相異字母都是最少時,則選出字典排序最小者。 <br /> ### 範例:輸入 ``` 3 ABBCAAB AABBACC AAPPCCSS ``` ### 範例:正確輸出 ``` AABBACC ``` <br /> ## Python 程式碼 於 ZeroJudge 測試結果,最長運算時間約為 35 ms,使用記憶體最多約為 5.9 MB,通過測試。 ```python= N = int(input()) # 讀取資料行數 data = [] # 字串資料 chars = [] # 每個字串的字母數量 idx = [-1] # 字母數量最少的字串索引值,先存入 -1 minL = 27 # 最少的字母數量,先存入 27 # 讀取 N 行資料 for i in range(N): data.append(input()) # 存入字串 chars.append(set(data[i])) # 用 set 格式存入 data[i] 的字母 if len(chars[i]) < minL: # 如果 chars[i] 的長度小於 minL idx = [i] # 將 idx 內容重設為 [i] minL = len(chars[i]) # minL 重設為 len(chars[i]) elif len(chars[i]) == minL: # 如果 chars[i] 的長度等於 minL idx.append(i) # 將 idx 內容加入 i # 比較字母數量相同的字串,依照字母順序找出字母排序較小者 ans = idx[0] # ans 預設為 idx[0] for i in range(1, len(idx)): # 依序取出 idx[1] ~ idx[-1] for c1, c2 in zip(data[ans], data[idx[i]]): # 取出字母 if c1 < c2: # 如果 c1 < c2,ans 不變,中斷迴圈 break elif c1 > c2: # 如果 c1 > c2,ans 重設為 idx[i],中斷迴圈 ans = idx[i] break print(data[ans]) # 印出答案 ``` <br /><br /> ## C++ 程式碼 於 ZeroJudge 測試結果,最長運算時間約為 60 ms,使用記憶體最多約為 836 kB,通過測試。 ```cpp= #include <iostream> #include <string> #include <vector> #include <set> using namespace std; int main() { int N; cin >> N; // 讀取資料行數 vector<string> data; // 字串資料 vector<size_t> idx; // 字母數量最少的字串索引值 size_t minL = 27; // 最少的字母數量,先存入 27 /* 讀取 N 行資料 */ for (int i=0; i<N; i++) { string s; cin >> s; // 讀取字串 data.push_back(s); // 存入字串 set<char> cs (s.begin(), s.end()); // 用 set 格式計算 s 的字母數量 if (cs.size() < minL) { // 如果 cs 的長度小於 minL idx.clear(); // 將 idx 內容重設為 {i} idx.push_back(i); minL = cs.size(); // minL 重設為 cs.size() } else if (cs.size() == minL) { // 如果 cs 的長度等於 minL idx.push_back(i); // 將 idx 內容加入 i } } /* 比較字母數量相同的字串,依照字母順序找出字母排序較小者 */ size_t ans = idx[0]; // ans 預設為 idx[0] for(size_t i=1; i<idx.size(); i++) { // // 依序取出 idx[1] ~ idx[-1] char c1, c2; for(size_t j = 0; j < min(data[ans].size(), data[idx[i]].size()); j++) { c1 = data[ans][j]; c2 = data[idx[i]][j]; if (c1 < c2) { // 如果 c1 < c2,ans 不變,中斷迴圈 break; } else if (c1 > c2) { // 如果 c1 > c2,ans 重設為 idx[i],中斷迴圈 ans = idx[i]; break; } } } cout << data[ans] << endl; // 印出答案 return 0; } ``` <br /><br /> --- ###### tags:`APCS`、`Python`、`C++`
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.