#40844: 解答 c++


hs210023@students.hshs.chc.edu ... (天底下最帥的那個男人)

學校 : 不指定學校
編號 : 274462
來源 : [39.9.190.55]
最後登入時間 :
2024-06-17 21:52:54
a224. 明明愛明明 | From: [27.247.62.93] | 發表日期 : 2024-06-14 21:51

這個問題的核心是判斷給定的字串是否可以重新排列成迴文。迴文的特性是:如果字串長度為偶數,則每個字母的出現次數必須是偶數;如果字串長度為奇數,則最多只能有一個字母的出現次數是奇數。

 

下面是解決這個問題的步驟:

 

  1. 忽略非英文字母的字元:只考慮英文字母,並且將大寫字母轉換為小寫字母。
  2. 統計每個字母的出現次數
  3. 判斷是否符合迴文的條件

 

以下是實現這個解決方案的程式碼:
 
#include <iostream>
#include <string>
#include <unordered_map>
#include <cctype>
using namespace std;

bool canFormPalindrome(const string& str) {
    unordered_map<char, int> charCount;
    for (char c : str) {
        if (isalpha(c)) {
            charCount[tolower(c)]++;
        }
    }

    int oddCount = 0;
    for (const auto& pair : charCount) {
        if (pair.second % 2 != 0) {
            oddCount++;
        }
    }

    return oddCount <= 1;
}

int main() {
    string input;
    while (getline(cin, input)) {
        if (canFormPalindrome(input)) {
            cout << "yes !" << endl;
        } else {
            cout << "no..." << endl;
        }
    }
    return 0;
}

 

 

 

 

說明

 

  1. **函數 canFormPalindrome**:
    • 使用 unordered_map 來統計每個字母的出現次數。
    • 只考慮英文字母,並將大寫字母轉換為小寫字母。
    • 計算出現次數為奇數的字母數量。如果這個數量不超過 1,則可以重新排列成迴文。
  2. **主程式 main**:
    • 使用 getline 讀取多行輸入。
    • 對每行輸入調用 canFormPalindrome 函數,並根據結果輸出「yes !」或「no...」。

 

這樣的程式碼能夠正確判斷字串是否可以重新排列成迴文,並且處理了大小寫字母的區分以及忽略非英文字母的需求。希望這個解決方案對你有幫助!
 
ZeroJudge Forum