# String Manipulation# Greedy# Character Conversion

j922 - 英文字母的大小寫

🔗 前往 ZeroJudge 原題

題目描述

題目要求將輸入的一段英文文字轉換成四種不同的格式:全大寫、全小寫、句首大寫其餘小寫,以及標題大小寫(每個單字首字母大寫,其餘小寫)。

解題思路

程式首先讀取輸入字串。然後,它執行以下步驟:

  1. 找出第一個字母的位置,用於後續的句首大寫轉換。
  2. 將所有大寫字母轉換為小寫字母。
  3. 複製原始字串到四個不同的字串變數,分別用於儲存四種格式的輸出。
  4. 將第一個字母轉換為大寫字母(句首大寫)。
  5. 遍歷字串,如果遇到小寫字母,且該字母是單字的第一個字母(前一個字元不是字母),則將其轉換為大寫字母(標題大小寫)。
  6. 將所有字母轉換為小寫字母(全小寫)。
  7. 輸出四個格式化的字串。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入字串的長度。程式需要遍歷字串多次,但每次遍歷都是線性時間。
  • 空間複雜度: O(n),程式複製了原始字串到三個額外的字串變數,因此空間複雜度與輸入字串的長度成正比。

程式碼

#include <iostream>
using namespace std;
int fr=-1,oft='a'-'A';
string s,a,c,d;
int main(){
	getline(cin,s);
	for(int i=0;i<s.size();++i){
		if(s[i]!=' '&&fr==-1)fr=i;
		if(s[i]>='A'&&s[i]<='Z'){
			s[i]+=oft;
		}
	}
	a=d=c=s;
	a[fr]-=oft;
	for(int i=0;i<s.size();++i){
		if(s[i]>='a'&&s[i]<='z'){
			if(i==0||!((s[i-1]>='a'&&s[i-1]<='z')||(s[i-1]>='A'&&s[i-1]<='Z'))){
				c[i]-=oft;
			}
			s[i]-=oft;
		}
	}
	cout << a << "\n" << s << "\n" << c << "\n" << d;
}

Discussion