本文最早发布于本人的洛谷博客(目前已经咕咕咕了)。
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章
中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
输入输出格式
输入格式:
共2行。
第1行为一个字符串,其中只含字母,表示给定单词;
第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式:
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数−1。
本来以为很简单,编着编着发现了一堆问题……(绝望)
因为要区分大小写,所以在读入后直接把所有的字母改为大写,之后在查找目标字符串最后加上空格,采用匹配首字母的方式进行查找,找到匹配的首字母后再次判断该字符之前是否为空格,若均为真则进入循环对之后的字符进行比对(由于第一个字母和最后一个字母并没有两边空格的形式,所以采用额外条件做特殊处理),在判断完全一致后增加计数并判断是否为第一次出现,若为真则将位置保存。
代码如下:
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> int main() { char target[12]; char es[1000001]; int count = 0,result=0; long place = -1; scanf("%10s", target); getchar(); gets(es); for (int i = 0; i <= 9; i++) { if (target[i] == 0) { target[i] = ' '; target[i + 1] = 0; count = i; break; } else if(target[i] > 90 ) { target[i] = target[i] - 32; } } for (int i = 0; i <= 999999; i++) { if (es[i] > 90) es[i] = es[i] - 32; else if (es[i] == 0) break; } for (int i = 0; i <= 999999; i++) { if ((target[0] == es[i])) { if (i != 0) { if (es[i-1] != ' ') { continue; } } for (int i1 = 1; i1 <= count; i1++) { if ((es[i + i1] == 0) && (i1 == count)) { result++; if (place == -1) place = i; break; } if (es[i + i1] != target[i1]) { i = i + i1 - 1; break; } if (i1 == count) { result++; if (place == -1) place = i; i += count; } } } else if (es[i] == 0) { break; } } if (result == 0) { puts("-1"); } else { printf("%d %ld\n", result, place); } system("pause"); return 0; }
发表评论