XDOJ398字符串压缩

标题:字符串压缩

问题描述:有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩)。

例如,字符串aaaaabbbabaaaaaaaaaaaaabbbb可压缩为a5b3aba13b4。

请设计一个程序,采用该压缩方法对字符串压缩并输出。请编写一个函数compress,采用该压缩方法对字符串src进行压缩。函数定义如下:

char *compress(char *src);

返回值:

指向压缩后的字符串数据

参数:

src:输入/输出参数,输入表示待压缩字符串,输出表示压缩后的字符串

注意:函数声明已包含在主程序中,不需要自己定义。只需要提交自定义的函数代码。

主程序如下:

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

char *compress(char*src);

int main()

{

char src[100];

scanf("%s",src);

char *ps = compress(src);

puts(ps);

return 0;

}

主函数输入说明:

输入第一行为源字符串src(长度小于100),该字符串只包含大小写字母。

主函数输出说明:

输出一个数据,表示压缩后的字符串。

主函数输入样例:

aaaaabbbabaaaaaaaaaaaaabbbb

主函数输出样例:

a5b3aba13b4

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *compress(char *src);
int main()
{
    char src[100];
    scanf("%s",src);

    char *ps = compress(src);
    
    puts(ps);
    return 0;
}
char *compress(char *src){
    
    int i=0,t=0,n=0;
    int ten;
    char ji;
    int oldstr=strlen(src);
    int sum=0;//计录新字符串长度 
     static char newsrc[100]={0};//设置静态变量
    int num=0;
    char py=src[0];
    for(i=0;i<oldstr;i++){
     if(src[i]==py){
            num++;
            
        }
     
        ji=src[i];
        newsrc[t]=ji;
        sum++; 
        if(num>2){ 
            if(src[i]!=src[i+1]||src[i+1]=='0'){
            n=t;
            if(num<10){
            newsrc[t-num+2]=num+48;//令连续字母的第2为成为记录的数字 
            sum=sum-num+2; //新字符串的长度减去重复个数加上数字 
            t=t-num+2;    
            
            }            
            else {
                ten=num/10;//考虑连续字符个数大于10小于100
                newsrc[t-num+2]=ten+48;
                newsrc[t-num+3]=num-ten*10+48;
                sum=sum-num+3; //新字符串的长度减去重复个数加上数字 
                t=t-num+3;
            }
                
            }
        } 
        t++; 
        py=src[i];
        if(src[i]!=src[i+1]) num=1;
        
    }
    newsrc[sum]='\0';
    
    return newsrc;
}

第一次发布,如有问题或更好的方法,欢迎在评论里指出。

//找不到例子苦想一下午

😭

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值