/*
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串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;
}
字符串压缩
最新推荐文章于 2024-01-24 12:00:33 发布