通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
输入pInputStr : 输入字符串lInputLen: 输入字符串长度
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
输入pInputStr : 输入字符串lInputLen: 输入字符串长度
输出 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
下面是我的实现,想不到什么好的算法,如果您有什么比较好的算法,请不吝惜赐教,非常感谢!
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define BUFSIZE 200
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
assert( (NULL != pInputStr) && (NULL != pOutputStr) );
memset(pOutputStr, '\0', lInputLen);
char curChar = '\0'; //当前的字符
int curCount = 0; //当前的字符个数
int lOutputLen = 0; //OutputStr字符串最新的长度,随着不断地写入不断地增加
curChar = *pInputStr++;
curCount = 1;
while (lInputLen--) //这儿使用lInputLen-- 与 *pInputStr != '\0'; 效果一致
{
if (curChar != *pInputStr) //如果新字符不等于当前的字符,就计入OutputStr
{
if (1 == curCount) //只有一个字符,将字符存入数组即可
{
pOutputStr[lOutputLen++] = curChar;
}
else //否则将数字与字符都存入数组
{
sprintf(pOutputStr+lOutputLen, "%d%c", curCount, curChar);
lOutputLen = strlen(pOutputStr);
}
curChar = *pInputStr++;
curCount = 1;
}
else //否则继续读入下一个字符
{
curChar = *pInputStr++;
curCount++;
}
}
}
int main()
{
char str[BUFSIZE] = {0};
char str2[BUFSIZE] = {0};
fgets(str, BUFSIZE, stdin);
stringZip(str, strlen(str), str2);
printf("%s \r\n", str2);
return 0;
}