求助,各位大哥大姐们帮忙看看这几道题
1、请编写一个程序,从输入中读取一篇中文文章,并统计出该文章中 ASCII 字符以外的重复出现的每一个字重复出现的次数。
文章使用 UTF-8 编码,可能会出现任何可以用 UTF-8 编码表示的字符(不限于中文)。
文章中所有的字符在 UCS-2 能够表示的范围内,即字符的 Unicode 值用两个字节就可以表示。
输入
一篇文章,总字数不限、每行字符数不限。每个字重复出现的次数不超过 60000 次。
输出
按照 Unicode 编码从小到大的顺序,输出文章中 ASCII 字符以外的每一个重复出现过的字重复出现的次数。每行一个,首先输出该字符(以 UTF-8 编码),然后输出一个空格和该字符的出现的次数。
如果文章中没有出现重复的字,则输出“No repeat!”。
注意
输入中可能出现错误的字符,在处理时请忽略这些字符,并在出现这种情况时输入错误字符的个数,如:“Illegal character count: 8”。
2、据说,如果有无穷多的母牛和无穷多的大型键盘,它们就可以创造出世界上最伟大的回文。在寻找回文时,可以不计文中的标点、空白和大小写,只要关注 26 个英文字母就可以了。但是要注意,在输出时要按照原样,也就是要保留原有的空白、标点和大小写。
你的任务,就是在不超过 20000 个字符的字符串中,寻找长度不超过 2000 的回文字符串(含空格和标点时)。
输入格式
一段文本,不超过 20000 个字符,可以有一行或多行,每行的长度不超过 80 个字符。
输出格式
输出的第一行为找到的最长的回文字符串的长度。后面的行应该包括该字符串,字符串两边多余的空格和标点都不需要输出,但字符串中的空格、标点和换行则需要按照原样输出。
如果文中有多个长度相同的回文字符串,只要输出第一个就可以了。
[解决办法]
第一题
1、首先要理解utf-8的编码规则。
2、在读入数据时使用fread,每次读入4096字节,按utf-8的规则解析,可以很容易区分出ascii和非ascii字符。
3、把非ascii字符转换成unicode字符,这样用两个字符可以表示,建立一个65536长度的数组即可以表示所有的字符,数组里放对应的字符出现的次数。由于最大次数不超过60000次,用short类型即可。
4、输出时直接遍历数组即可,注意跳过前面127个属于ascii字符范围的值即可。
[解决办法]
第二题有点思路
从原串中不停的取字符串(利用下标移动,在原串中操作),从最长的开始判断是否是回文
是则输出
- C/C++ code
例如:原串为xabbay取原串 xabbay(x != y不是回文)长度减1 xabba(x != a不是回文) abbay(a != y不是回文)长度减2 xabb(x != b不是回文) abba(是回文结束并输出) bbay(不是回文,这步不必写,为说明取字符串的步骤才写的)