字符串处理——单词查找

原题如下:
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章
中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
输入格式:
共2行。
第1行为一个字符串,其中只含字母,表示给定单词;
第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式:
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);如果单词在文章中没有出现,则直接输出一个整数−1。
数据范围
1≤单词长度≤10。
1≤文章长度≤1,000,000。

输入样例#1:
To
to be or not to be is a question
输出样例#1:
2 0
输入样例#2:
to
Did the Ottoman Empire lose its power at that time
输出样例#2:
-1

下面是我的代码:

/*统计单词数*/
#include<stdio.h>
#include<string.h>
main()
{
 char a[11],b[1000001];
 int i=0;
 gets(a);
 gets(b);
 while(a[i]!='\0')
 {
  if(a[i]>='a') a[i]-=32;
 }
 while(b[i]!='\0')
 {
  if(b[i]>='a') b[i]-=32;
 }
 strcat(a," ");
 strcat(b," ");
 int s,n=0,j,ss=0,k,rec;
 for(i=0;b[i]!='\0';i++)
 {
  if(b[i]==' ')
  {
   s=1;
   for(j=n,k=0;j<=i,a[k]!='\0';j++,k++)
   {
    if(b[j]==a[k]) s*=1;
    else s*=0;
   }
   if(s==1) ss++;
   
   if(s==1&&ss==1) rec=n;
   n=i+1;
  }
 }
 if(ss==0) printf("-1");
 else if(ss>=1) printf("%d %d",ss,rec);
 
 
}

几个关键点:
①在定义a,b两个字符串时,单词最长为10,文章最长为1000000,由于是用char定义字符串,所以字符串末尾必须要有’\0’,所以定义a[11],b[1000001]。
②用gets实现输入,才可以处理空格。
③由于单词不区分大小写,所以将每个小写字母转换为大写,而且小写转换为大写更方便,只需判断是否大于’a’即可。
④ 用 strcat(a," “); strcat(b,” "); 为两个字符串末尾加上空格,是为了使每一段成单词加空格形式,方便后续对每一段的循环操作。

for(i=0;b[i]!='\0';i++)
 {
  if(b[i]==' ')
  {
   s=1;
   for(j=n,k=0;j<=i,a[k]!='\0';j++,k++)
   {
    if(b[j]==a[k]) s*=1;
    else s*=0;
   }
   if(s==1) ss++;
   
   if(s==1&&ss==1) rec=n;
   n=i+1;
  }
 }

接下来分析这个循环中的各个组成部分
(1)首先,它的循环末端是字符串b的’\0’,就是表示一直循环到b结束,即要查找完整段文章。
(2)当b[i]为第一个空格时,此时n=0,即b[n]为第一个单词的第一个字母。
(3) for(j=n,k=0;j<=i,a[k]!=’\0’;j++,k++)
if(b[j]==a[k])
此时,将n的值付给j,用b[j]表示b中这一段每个字母;为k赋值为0,a[k]表示这个单词的每个字母,并将每个字母对应比较。
(4)

s=1;
 for(j=n,k=0;j<=i,a[k]!='\0';j++,k++)
 {
  if(b[j]==a[k]) s*=1;
  else s*=0;
 }

当b[i]为空格时,做标记s=1;在下面的比较中,如果b[j]与a[k]始终相等,则s最后为1,而一旦出现不等,s一定为0
此法的巧妙之处在于:** s*=1;s*=0;这两个标记:始终相等,则s最后为1,而一旦出现不等,s一定为0 **
(5)
~~~
if(s==1) ss++;

if(s1&&ss1) rec=n;
n=i+1;
~~~
第一句就是简单的计数,第二句是题目要求的找到第一个相同的单词在文章中出现的位置。
** 注意,n=i+1指的是一次循环的末尾,需要再将n指向下一个单词的开头。 **
⑥最后输出ss表示文章中相同单词的个数,rec就是第一个相同单词的位置。

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值