首页 > 代码库 > 短语搜索
短语搜索
短语搜索
总提交: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; }