短语搜索

74 篇文章 0 订阅

短语搜索

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:535            测试通过:170

描述

常见文本编辑器的一个功能是搜索,打开一段英文文字,根据一个给定的英文短语,可以搜索得到这个短语在文章中的位置,短语有可能重复出现。现请求出给定的短语在一段文字中出现的最后一个位置。文字中单词从1开始编号,所求的位置为短语第1个单词在这段文字中对应单词的编号。

输入

多行,每行以 # 为结束,第1行为一段英文文字(单词数、数字不多于500),其余行是待搜索的英文短语(单词数不多于10)。这里英文文字、英文短语只包含英文单词,这些单词以空格分隔。

输出

多行,每一行对应输入中给定的短语在文字中出现的最后一个位置,搜索不到时输出-1

样例输入

STOCKHOLM April 21 PRNewswire FirstCall Students from St Petersburg State University of IT Mechanics and Optics are crowned the 2009 ACM International Collegiate Programming Contest World Champions in the Stockholm Concert Hall where the Nobel Prizes are presented every year Sponsored by IBM the competition took place today at KTH the Royal Institute of Technology #
STOCKHOLM #
St Petersburg State University of IT Mechanics and Optics #
World Champions #
the #
NUPT #

样例输出

1
8
26
51
-1

题目来源

南京邮电大学计算机学院首届ACM程序设计大赛(2009)


分析:其实对于字符串的处理我有自信的。唯一需要注意的就是细节问题。遥想当年,用C写的多线程下载器,老泪纵横啊。成功的那瞬间,真是顺畅  \(^o^)/

真正写个东西,真的是要分模块,一步一步做,还真就像搭积木一样,底部牢固了,上面才安全。

不过还是感觉做得太慢了。


看到字符串中字符串出现的位置,首推strstr函数,成功返回首次出现的指针,失败回归false。指针嘛,指来指去的我已经很熟悉了。

输入也是一个问题,如果用string的话,空格输入不进去,所以放弃。最后选用char型数组。注意:数组要长一点(老生常谈了!)索性开了个10000。然后用gets输入。


接下去就是判断第几个单词的问题了。简单,用空格判断。原来输入的字符串s一共num1个空格。指针p指向s中首次出现要找的字符串find的位置,求出p指向的字符串有num2个空格。所以输出 num1 - num2 + 1 。(输入的字符串gets(input) ,去除空格和# 得到字符串 find ,方便查找)


最后解决找 "the #" 字符串的问题。因为要找最后一次出现的位置,上循环。

这里犯了一个在以前写多线程下载器时经常犯的错误。

一开始循环这样写的:

while(strstr(p, find) != false)
{
p = strstr(p, find);
}

死循环。

改成:

while(strstr(p+1, find) != false)
{
p = strstr(p+1, find);
}

OK,Bingo!        酷炫の代码 ~

#include<stdio.h>
#include<string.h>

//短语搜索

int main()
{
	char s[10000], input[10000], find[10000];
	char *p;

	gets(s);
	//printf("%s",s);
	while(gets(input))
	{
		int num1=0, num2 =0;
		int i;
		//printf("%s\n",input);
		for(i =0;s[i];i++) //原来多少个空格
		{
			if(s[i] == ' ')
				num1 ++;
		}

		for(i=0;input[i];i++)
		{
			if(input[i] == '#')
				break;
			find[i] = input[i];
		}
		find[i] = '\0';

		p = strstr(s, find);

		if(p == false)
			printf("-1\n");
		else
		{
			while(strstr(p+1, find) != false)
			{
				p = strstr(p+1, find);
			}
			//printf("%s\n",p);
			for(i=0;*(p+i);i++)
			{
				if(*(p+i) == ' ')
					num2 ++;
			}
			printf("%d\n",num1 -num2 + 1);
		}

	}

	return 0;
}






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值