记录字符串压缩

该文章介绍了一种C语言实现的字符串压缩方法,通过统计连续重复的字符个数并转换为字符串形式来压缩原字符串。主要函数包括num2str用于数字到字符串的转换,compressString用于字符串压缩。代码中考虑了字符集包含空格、大小写字母和数字的情况。
摘要由CSDN通过智能技术生成

算法 C语言 压缩字符串_c语言压缩字符串_程序猫 猫小白的博客-CSDN博客 

统计字符串个数,如果个数大于9,需要转成字符存储,不能直接输出数字和正在统计的字符,会很慢

 参考代码

class Solution {
public:
    string num2str(int val){
        string ans;
        while(val/10){
            ans.push_back((char)('0'+val%10));
            val/=10;
        }
        ans.push_back((char)('0'+val%10));
        return ans;
    }
    string compressString(string S) {
        string ss=S;
        S.push_back('\n');
        int left=0,right=1;
        int n = S.size();
        int ans1[50500];
        int ans2[50500];
        int cnt=1;
        int i = 0;
        for(right=1;right<n;right++){
            if(S[left]==S[right]){
                cnt++;
            }else{
                ans1[i]=cnt;
                ans2[i]=S[left];
                i++;
                cnt=1;
                left=right;
            }
        }
        string ans;
        for(int j = 0; j< i;j++){
            ans.push_back(ans2[j]);
            string tmpstr = num2str(ans1[j]);
            int tmpstrlen=tmpstr.size();
            for(int k = tmpstrlen-1; k >= 0;k--)
                ans.push_back(tmpstr[k]);
            
        }
        if(ans.size()+1>=n)return ss;
        else
            return ans;
    }
};

如果限定字符有空格,大小写字母和数字,直接输出压缩结果即可,注意,应该需要将字符出现的次数转化成字符串,如果直接输出出现的次数,输出耗时较长

#include<iostream> 
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int n;
char ch;
int ans1[10050];
int ans2[10050];
int str[10050];

string num2str(int val){
        string ans;
        while(val/10){
            ans.push_back((char)('0'+val%10));
            val/=10;
        }
        ans.push_back((char)('0'+val%10));
        return ans;
    }
string compressString(string S) {
        S.push_back('\n');
        int left=0,right=1;
        int n = S.size();
        int ans1[50500];
        int ans2[50500];
        int cnt=1;
        int i = 0;
        for(right=1;right<n;right++){
            if(S[left]==S[right]){
                cnt++;
            }else{
                ans1[i]=cnt;
                ans2[i]=S[left];
                i++;
                cnt=1;
                left=right;
            }
        }
        string ans;
        for(int j = 0; j< i;j++){
            ans.push_back(ans2[j]);
            string tmpstr = num2str(ans1[j]);
            int tmpstrlen=tmpstr.size();
            for(int k = tmpstrlen-1; k >= 0;k--)
                ans.push_back(tmpstr[k]);
            
        }
        return ans;
    }

int main(){
/*
	cin>>n;scanf("%c",&ch);
	for(int i = 0;i <= n;i++){
		int length=0;
		int cnt=1;
		int totlen=0;
		while(scanf("%c",&ch),ch!='\n'){
			str[length++]=ch;
		}
		str[length++]=(int)('\n');
		if(str[length-1]==ch)cnt++;
			else{
				ans2[totlen]=str[length-1];
				ans1[totlen++]=cnt;
				cnt=1;
			}
		if(length==2){
			printf("%d%c",1,str[0]);
		}else{
			int totlen=0;
			int cnt=1;
			int left=0,right=1;
			while(right<length){
				while(str[left]==str[right]){
					cnt++;
					right++;
				}
				ans2[totlen]=str[left];
				ans1[totlen++]=cnt;
				cnt=1;left=right;right++;
			}
			for(int i = 0;i < totlen;i++)
				printf("%d%c",ans1[i],ans2[i]);
			printf("\n");
		}	
}
*/
	string S; 
	int length=0;
	int cnt=1;
	int totlen=0;
	while(scanf("%c",&ch),ch!='\n'){
		S.push_back(ch);
	}
	string ans1 = compressString(S); 
	cout<<ans1<<endl;
	return 0;
}

注:可能上述做法也不是正确解决方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值