# String Manipulation# Greedy# Compression

d574 - 節約符咒

🔗 前往 ZeroJudge 原題

題目描述

題目要求將輸入的字串進行壓縮,將連續重複的字元以其個數和字元本身表示。例如,"aaabb" 壓縮後變成 "3a2b"。如果壓縮後的字串長度不小於原始字串,則輸出原始字串。

解題思路

程式碼遍歷輸入字串,統計連續重複字元的個數。當遇到不同的字元時,將前一個字元的個數和字元本身轉換為字串,並添加到結果字串中。最後處理字串末尾的字元。比較壓縮後字串和原始字串的長度,輸出較短的字串。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入字串的長度。程式碼遍歷字串一次。
  • 空間複雜度: O(n),最壞情況下,壓縮後的字串長度可能與原始字串相同,因此需要額外的空間來儲存壓縮後的字串。

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int aa;
	while(cin >> aa){
		int a=aa;
		string ans,ans2;
		int con=1;
		char b,c;
		bool f=0;
		while(a--){
			cin >> b;
			ans2+=b;
			if(f==0){
				f=1;
				c=b;
				continue;
			}
			if(b==c)
				++con;
			else{
				string tmp;
				while(con>0){
					tmp+=con%10+48;
					con/=10;
				}
				reverse(tmp.begin(),tmp.end());
				ans+=tmp;
				ans+=c;
				c=b;
				con=1;
			}
		}
		string tmp;
		while(con>0){
			tmp+=con%10+48;
			con/=10;
		}
		reverse(tmp.begin(),tmp.end());
		ans+=tmp;
		ans+=c;
		con=1;
		if(aa>ans.length()){
			cout << ans << "\n";
		}
		else{
			cout << ans2 << "\n"; 
		}
	}
}

Discussion