50. 【字符】压缩文本文件
背景:
压缩是一种有效的减小数据量的方法,目前已经被广泛应用于各种类型的信息系统之中。
一种压缩文本文件(假设文件中不包含数字)的方法如下:
1. 原始文本文件中的非字母的字符,直接拷贝到压缩文件中;
2. 原始文件中的词(全部由字母组成),如果是第一次出现,则将该词加入到一个词的列表中,并拷贝到压缩文件中;否则该词不拷贝到压缩文件中,而是将该词在词的列表中的位置拷贝到压缩文件中。
3. 词的列表的起始位置为 1 。 词的定义为文本中由大小写字母组成的最大序列。大写字母和小写字母认为是不同的字母,即 abc 和 Abc 是不同的词。词的例子如下: x-ray 包括两个词 x 和 ray;mary's 包括两个词 mary 和 s;a c-Dec 包括三个词 a 和 c 和 Dec 编写一个程序,输入为一组字符串,输出为压缩后的文本。
输入:
输入为一段文本,可以假设输入中不会出现数字、每行的长度不会超过 80 个字符,并且输入文本的大小不会超过 10M。
输出:
压缩后的文本。
| 测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 |
测试用例 1 |
|
| 1秒 | 1024KB | 0 |
测试用例 4 |
|
| 1秒 | 10240KB | 0 |
这道题确实感觉有点难
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
int main(void){
/*每次读入一行,直到文件结束(NULL)
* 判断是否为单词,如果是的话,记录下这个单词,否则原封不动的输出
* (判断单词是个难点,方法是如果 第一个字母 的前面不是字母,最后一个字母 的后面不是字母,那么它就是一个单词)
* 再判断这个单词是否可被压缩(即将这个单词与单词记录本对比)有的话压缩,否则 输出原单词
* 遇到换行符换行
*/
char temp[100],record[10000][100]={0};
int words_number = 0,start=1,end=0;
temp[0] = '#';
while (fgets(temp+1, 100, stdin)) {
for (int i = 1; i < strlen(temp); i++,end=0) {
if (isalpha(temp[i])) {
if ( !isalpha(temp[i - 1])) start = i;
if ( !isalpha(temp[i + 1])) end = i;
if (start <= end) {
char t = temp[end + 1];
temp[end + 1] = '\0';
strcpy(record[words_number], &temp[start]);
temp[end + 1] = t;
bool flag = true;
for (int j = 0; j < words_number; j++)
if (!strcmp(record[j], record[words_number])) {
printf("%d", j+1);
flag = false;
memset(record[words_number], 0, sizeof record[words_number]);
break;
}
if (flag) fputs(record[words_number++], stdout); // 这里将words_number加一了
}
}
else
putchar(temp[i]);
}
}
return 0;
}