本文最早发布于本人的洛谷博客(目前已经咕咕咕了)。
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章
中的某一独立单词在不区分大小写的情况下完全相同(参见样例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;
}
发表评论