背景:
压缩是一种有效的减小数据量的方法,目前已经被广泛应用于各种类型的信息系统之中。
一种压缩文本文件(假设文件中不包含数字)的方法如下:
1. 原始文本文件中的非字母的字符,直接拷贝到压缩文件中;
2. 原始文件中的词(全部由字母组成),如果是第一次出现,则将该词加入到一个词的列表中,并拷贝到压缩文件中;否则该词不拷贝到压缩文件中,而是将该词在词的列表中的位置拷贝到压缩文件中。
3. 词的列表的起始位置为 1 。 词的定义为文本中由大小写字母组成的最大序列。大写字母和小写字母认为是不同的字母,即 abc 和 Abc 是不同的词。词的例子如下: x-ray 包括两个词 x 和 ray;mary's 包括两个词 mary 和 s;a c-Dec 包括三个词 a 和 c 和 Dec 编写一个程序,输入为一组字符串,输出为压缩后的文本。
输入:
输入为一段文本,可以假设输入中不会出现数字、每行的长度不会超过 80 个字符,并且输入文本的大小不会超过 10M。
输出:
压缩后的文本。
#include<stdio.h>
#include<string.h>
int main(){
int word=0,i=0,j=0,k=0,flag=1,m=0;
char s[500],words[10000][100],a[500];
for(i=0;i<10000;i++)
for(j=0;j<100;j++)
words[i][j]='\0';
while(gets(a) != NULL){//得到一行
if('\0'==a[0]){printf("\n");continue;}//只有一个换行符,那就换行
//有意义的一行,初始化
for(i=0;a[i]!='\0';i++)s[i+1]=a[i];
s[0]='.';s[i+1]='\0';k=0; i=1;
while(s[i]!='\0'){//依次处理每个字符
if((s[i]>='a' && s[i]<='z')||(s[i]>='A' && s[i]<='Z')){
//这是一个字母
if(!((s[i-1]>='a' && s[i-1]<='z')||(s[i-1]>='A' && s[i-1]<='Z'))){
word++;k=0;words[word][k++]=s[i];}//这是一个单词的开头
else{words[word][k++]=s[i]; }//把这个字母放好了,干点儿别的
if(!((s[i+1]>='a' && s[i+1]<='z')||(s[i+1]>='A' && s[i+1]<='Z'))){ //单词结束就审判
words[word][k]='\0';
flag=1;
for(j=1;j<word;j++){
if(!strcmp(words[j],words[word])){
printf("%d",j);
for(m=0;m<100;m++){words[word][m]='\0';}
word--;
flag=0;
break;
}
}
if(flag){printf("%s",words[word]);}}
}else{
putchar(s[i]);
}i++; }
printf("\n");
}
return 0;
}