# Greedy# String Manipulation

a520 - 12416 - Excessive Space Remover

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算將輸入字串中連續空白減少到最多一個空白所需的「全部取代」動作次數。一個動作定義為將兩個連續空白替換為一個空白。

解題思路

此題可以使用貪心演算法解決。我們遍歷字串,統計連續空白的數量。每次遇到連續空白結束(或到達字串末尾),如果連續空白數量大於 1,則需要執行一次「全部取代」動作,並更新最大連續空白數量。最終,所需的動作次數等於最大連續空白數量所需的「全部取代」次數,即 ceil(log2(max))

複雜度分析

  • 時間複雜度: O(n),其中 n 是字串的長度。因為我們需要遍歷字串一次。
  • 空間複雜度: O(1),因為我們只使用了常數額外的空間。

程式碼

#include <iostream>
#include <string>
#include <math.h> 
using namespace std;
int main(){
	string a;
	while(getline(cin,a)){
		a+=' ';
		int b=0,max=0;
		bool c=0;
		if(a[0]==' '){		
			b++;
			c=0;
		}
		else
			c=1;
		for(int i=1;i<a.length();i++){
			if(a[i]==' '||i==a.length()-1){
				if(c==1){
					if(b>max)
						max=b;
					b=0; 
				}
				b++;
				c=0;
			}
			else{
				c=1;
			}
		}
		if(max==0)
			cout << 0 << endl;
		else
			cout << ceil(log2(max)) << endl;
	}
}

Discussion