字符串压缩

/*
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

示例1:

 输入:"aabcccccaaa"
 输出:"a2b1c5a3"
示例2:

 输入:"abbccd"
 输出:"abbccd"
 解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:

字符串长度在[0, 50000]范围内。

来源:力扣(LeetCode)
*/
/*
说明:
源字符串遍历,目标字符串赋值
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>

char* compressString(char* S) {
	int len;
    int i;
	int cnt = 0;
	char cntStr[8] = {0};
	char* buf = NULL;
	char *srcPtr, *dstPtr;
	
	if (!S|| !strlen(S)) {
		return S;
	}
	len = strlen(S);
	buf = (char*)malloc(len + 1);
	if (!buf) {
		return S;
	}
	srcPtr = S;
	dstPtr = buf;
	*dstPtr = *S;
	cnt = 0;
	while (srcPtr) {			
		//遍历检查
		if (*srcPtr == *dstPtr){
			cnt++;
			srcPtr++;
		} 
		if (*srcPtr != *dstPtr || *srcPtr == '\0'){
			memset(cntStr, 0, sizeof(cntStr));
			sprintf(cntStr, "%d", cnt);
			cnt = 0;
			if (dstPtr + strlen(cntStr) - buf + 1>= len) {
				free(buf);
				return S;
			}
            for (i = 0; i < strlen(cntStr); i++) {
                dstPtr[i+1] = cntStr[i];
            }
			dstPtr += (strlen(cntStr) + 1);
			*dstPtr = *srcPtr;
			if (*srcPtr == '\0') {
				break;
			}
		}
	}
	*(dstPtr+1) = '\0';
	
	return buf;
}

int main(){
	char srcBuf[50000+1] = {0};
	
	while(1) {
		memset(srcBuf, 0, sizeof(srcBuf));
		printf("input:");
		fgets(srcBuf, sizeof(srcBuf), stdin);
		srcBuf[strlen(srcBuf) - 1] = '\0';
		printf("result:%s\r\n", compressString(srcBuf));
	}

	return 0;
}












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值