# String Manipulation# Conditional Statements# Greedy

a785 - 7. It's All Greek To Me

🔗 前往 ZeroJudge 原題

題目描述

題目要求根據給定的希臘根字和後綴字,按照特定規則生成縮寫後的字對。規則基於根字結尾和後綴字開頭的母音,並用表格定義了縮寫的映射關係。輸入為 "根字-後綴字" 的形式,直到輸入 "END" 為止。

解題思路

程式碼首先將輸入字串分割成根字和後綴字。然後,根據根字的最後一個字母和後綴字的第一個字母,使用一系列的 if-else if 條件判斷來確定縮寫規則。根據規則,可能需要替換根字的最後一個字母,或者在根字後面添加額外的字母。最後,將縮寫後的根字和後綴字連接起來並輸出。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入字串的長度。因為程式碼需要遍歷輸入字串來分割根字和後綴字,以及遍歷後綴字來輸出結果。
  • 空間複雜度: O(n),因為程式碼需要儲存根字和後綴字,以及縮寫後的字串。

程式碼

#include <iostream>
using namespace std;
int main(){
	string a;
	while(cin >> a){
		if(a=="END")break;
		int al=a.length(),it=0;
		string b,c;
		for(;a[it]!='-';++it)
			b+=a[it];
		for(++it;it<al;++it)
			c+=a[it];
		int bl=b.length(),cl=c.length();
		it=1;
		char f=b[bl-1];
		if(c[0]=='a'){
			if(f=='a')
				b[bl-1]='a';
			else if(f=='e')
				b[bl-1]='y';
			else if(f=='o')
				b[bl-1]='w';
		}
		else if(c[0]=='e'){
			if(f=='a')
				b[bl-1]='a';
			else if(f=='e'){
				b[bl-1]='e';
				b+='i';
			}
			else if(f=='o'){
				b[bl-1]='o';
				b+='u';
			}
		}
		else if(c[0]=='i'){
			if(f=='a'){
				b[bl-1]='a';
				b+='i';
			}
			else if(f=='e'){
				b[bl-1]='e';
				b+='i';
			}
			else if(f=='o'){
				b[bl-1]='o';
				b+='i';
			}
		}
		else if(c[0]=='y'){
			if(f=='a')
				b[bl-1]='a';
			else if(f=='e')
				b[bl-1]='y';
			else if(f=='o')
				b[bl-1]='w';
		}
		else if(c[0]=='o'&&c[1]=='u'){
			if(f=='a'){
				b[bl-1]='w';
				it=2;
			}
			else if(f=='e')
				b[bl-1]='o';
			else if(f=='o')
				b[bl-1]='o';
		}
		else if(c[0]=='o'){
			if(f=='a')
				b[bl-1]='w';
			else if(f=='e'){
				b[bl-1]='o';
				b+='u';
			}
			else if(f=='o'){
				b[bl-1]='o';
				b+='u';
			}
		}
		else if(c[0]=='w'){
			if(f=='a')
				b[bl-1]='w';
			else if(f=='e')
				b[bl-1]='w';
			else if(f=='o')
				b[bl-1]='w';
		}
		cout << b;
		for(;it<cl;++it)
			cout << c[it];
		cout << "\n";
	}
}

Discussion