題目敘述
題目採EOF輸入測資,每一行有一個沒有空白字元的字串,如果字串重組後可以變成迴文則輸出「yes !」,反之則輸出「no...」。 標點符號不再迴文判斷範疇內,大小寫英文字母皆為相同的字元 (例:A = a)。
範例輸入
ababa
bbaaa
Level
aaabbbcc
abcdefg
HowAreYouToday
A_man,_a_plan,_a_canal:_Panama.
範例輸出
yes !
yes !
yes !
no...
no...
no...
yes !
解題思路
因為題目的要求為「可重組」,所以就要使用迴文的定義來判斷字串是否可以組成一個迴文。在迴文中,每一個字元都是雙雙成對的,除非字串長度為奇數則最中間的字元為非成對出現。所以可以利用MAP來統計每一個字元所出現的次數,並且使用「isalpha(str[i])」和「tolower(str[i])」來判斷目前的字元是否是英文字母且強制將所有英文字母轉換為小寫來避免大小寫判斷問題。迴圈結束後從0到26跑一次For迴圈來確定每一個英文字母的MAP值都是偶數,如果有超過一個字母為非偶數的情況 (剛剛講到的中間字元非成對出現的狀況),則此字串不可變成迴文。
解題程式碼如下 (僅供參考):
#include <iostream>
#include <map>
using namespace std;
int main() {
string str;
while (cin >> str)
{
map<int, int>MAP;
for (int i = 0; i<str.size(); i++)
{
if (isalpha(str[i])) MAP[tolower(str[i]) - 'a']++;
}
int count = 0;
for (int i = 0; i<26; i++)
{
if (MAP[i] % 2 != 0) count += 1;
}
if (count > 1) cout << "no..." << endl;
else cout << "yes !" << endl;
}
}
留言
張貼留言