字符串压缩
例如"aaabgeetyyyppp" 压缩过后"a3bge2ty3p3"
gcc version 4.8.2 (GCC) 和 VS2013下编译通过
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 100
char Buffer[N];
// 交换字符数组的任意始末位置的原素
void Swap(char *Str, int A, int B)
{
int i, j;
for (i = A, j = B; i<j; i++, j--)
{
char temp = Str[i];
Str[i] = Str[j];
Str[j] = temp;
}
}
// A为总计出现的次数,B为该字符出现的位置
void MoveStr(char *Str,const int A,const int B,const char ch)
{
int j, k;
int p = B;
int s = A;
// 如果输入的字符串中连续的字符超过9个 使用例如 Str[i]=A+'0'时会出错
do
{
Str[++p] = s % 10 + '0';
} while (s /= 10);
Swap(Str, B + 1, p);
for (j = A + B, k = p + 1; j < strlen(Str); j++)
{
Str[k++] = Str[j];
}
Str[k] = '\0';
}
void CompressStr(char *Str)
{
int i, count = 1;
for (i = 0; i < strlen(Str) - 1; i++)
{
if (Str[i] == Str[i + 1])
{
count++;
}
else
{
if (count >1)
{
int Pos = i - count + 1;
MoveStr(Str, count, Pos, Str[i - 1]);
i = i - count + 1; // 改变i值重新循环
count = 1; // count清1重新循环
}
}
}
}
int main()
{
gets(Buffer);
Buffer[strlen(Buffer)] = '.'; // 做了一点小技巧,避免出现当输入例如AAA时结果出错
Buffer[strlen(Buffer)] = '\0';
CompressStr(Buffer);
Buffer[strlen(Buffer) - 1] = '\0'; // 去掉添加的符号
printf("%s\n", Buffer);
system("pause");
return 0;
}