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. Please, please do it--it would please Mary very,↵
  2. very much.↵
  3. Thanks↵


以文本方式显示


  1. Please, please do it--4 would 2 Mary very,↵
  2. 7 much.↵
  3. Thanks↵


1秒

1024KB

0

测试用例 4

以文本方式显示


  1. Try to solve them within short time. At first, you may↵
  2. need try Try TRY TRY Try try try more and more time to solve even simple problems. But do not be↵
  3. pessimistic. It is for your lack of practice. Try to solve easier problems↵
  4. as they increase your programming ability. ↵


以文本方式显示


  1. Try to solve them within short time. At first, you may↵
  2. need try 1 TRY 14 1 13 13 more and 15 7 2 3 even simple problems. But do not be↵
  3. pessimistic. It is for your lack of practice. 1 2 3 easier 19↵
  4. as they increase 28 programming ability. ↵


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;
}