# String# Greedy# Palindrome

a224 - 明明愛明明

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷給定的字串是否能重新排列成迴文。字串只包含大小寫英文字母和標點符號,需要忽略非英文字母,並將大小寫字母視為相同。

解題思路

首先,將輸入字串轉換為小寫,並移除所有非英文字母。然後,統計每個字母出現的次數。如果字串長度為偶數,則所有字母的出現次數都必須是偶數才能形成迴文。如果字串長度為奇數,則只能有一個字母的出現次數為奇數,其餘字母的出現次數必須是偶數。程式碼中,使用一個貪婪的策略,將配對的字母替換為 '0',最後檢查是否所有字母都已配對。

複雜度分析

  • 時間複雜度: O(n^2),其中 n 是字串的長度。這是因為程式碼使用了嵌套迴圈來查找配對的字母。
  • 空間複雜度: O(1),因為使用的額外空間是固定的,不隨輸入字串的長度變化。

程式碼

#include <iostream>
#include <string> 
using namespace std;
int main(){
	std::ios::sync_with_stdio(false);
    std::cin.tie(0);
	string a,b;
	bool c=false;
	while(cin >> a){
		b.clear();
		for(int i=0;i<a.length();i++){
			if(a[i]>=65&&a[i]<=90){
				b+=a[i]+32;
			}
			else if(a[i]>=97&&a[i]<=122){
				b+=a[i];
			}
		}
		c=true;
		if(b.length()%2==0){
			for(int i=0;i<b.length();i++){
				for(int j=i+1;j<b.length();j++){
					if(b[i]==b[j]&&b[i]!='0'&&b[j]!='0'){
						b[i]='0';
						b[j]='0';
					}
				}
			}
			for(int i=0;i<b.length();i++){
				if(b[i]!='0'){
					c=false;
					break;
				}
			}
		}
		else{
			int d=true;
			for(int i=0;i<b.length();i++){
				for(int j=i+1;j<b.length();j++){
					if(b[i]==b[j]&&b[i]!='0'&&b[j]!='0'){
						b[i]='0';
						b[j]='0';
					}
				}
			}
			for(int i=0;i<b.length();i++){
				if(b[i]!='0'){
					if(d==false){
						c=false;
						break;
					}
					d=false;
				}
			}
		}
		if(c==true){
			cout << "yes !" << endl;
		}
		else{
			cout << "no..." << endl;
		}
	}
}

Discussion