EOJ 3018 查找单词

有一个单词 W,输出它在字符串 S 中从左到右第一次出现的位置 IDX(设 S 中的第 1 个字符的位置为 1)。W 只由英文字母组成,S 除英文字母和汉字之外在任何位置(包括头和尾)另有一个或多个连续的空格。

查找单词时,不区分大小写,但要求完全匹配,即单词 W 必须与 S 中的某一独立单词在不区分大小写的情况下完全匹配。W 仅是 S 中某一单词的一部分就不算匹配。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #define length 1000001
 5 void strlwr(char *s)
 6 {
 7     char *p=s;
 8     while(*p)
 9     {
10         if(*p>='A'&&*p<='Z')
11             *p=*p+32;
12         p++;
13     }
14 }
15 int main()
16 {
17   int num;
18   scanf("%d", &num);
19   for (int s = 0; s < num; s++)
20   {
21       char words[11], sen[length];
22 
23       scanf("%s", words);
24       getchar();
25       gets(sen);
26 
27       strlwr(words);
28       strlwr(sen);
29 
30       int len = strlen(words),lens = strlen(sen);
31       sen[lens] = ' ';
32       sen[lens + 1] = 0;
33 
34       char *p,*ps = sen;
35       while (1)
36       {
37           p = strstr(ps, words);
38           if (p == 0)
39               break;
40           if (p == sen&&*(sen + len) == ' ')
41               break;
42           if (*(p - 1) == ' '&&*(p + len) == ' ')
43               break;
44           ps = p + len;
45       }
46 
47       if (p == 0)
48           printf("case #%d:
None
", s);
49       else
50       {
51           int pos = p - sen + 1;
52           printf("case #%d:
%d
", s, pos);
53       }
54   }
55 return 0;
56 
57 }

C++实现

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string>
 4 using namespace std;
 5 string strlwr(string a){
 6     for(int i=0;i<a.size();i++)
 7         a[i]=tolower(a[i]);
 8     return a;
 9 }
10 int main()
11 {
12     int T;scanf("%d
",&T);
13     for(int m=0;m<T;m++){
14         string a,ss;cin>>a;getchar();
15         getline(cin,ss);
16         a=strlwr(a);ss=strlwr(ss);
17         ss+=' ';ss.insert(0," ");
18 
19         int pos=0,tmp=0,l=a.size(),flag=1;
20         while((tmp=ss.find(a))!=-1){
21             pos+=tmp;
22             if(ss[tmp-1]==' '&&ss[tmp+l]==' '){
23                 flag=0;
24                 break;
25             }
26 
27             else{
28                 ss.erase(0,tmp+l);
29                 pos+=l;
30             }
31         }
32         if(flag)   printf("case #%d:
None
",m);
33         else printf("case #%d:
%d
",m,pos);
34     }
35     return 0;
36 }

以上是我的代码,思路是一样的,C可以控制strstr从指针处开始寻找,而C++的find似乎没有从字符串的某一位置开始找的功能,因此只好用erase删除,并且还要注意后续对pos的操作。

然后在讨论区看到了更精简的,直接在find的时候添加空格以此确定是不是单独的单词就行了!

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main(){
 4     int t,k;
 5     string s,s1;
 6     cin>>t;
 7     getchar();
 8     for(int i=0;i<t;++i){
 9         getline(cin,s);
10         getline(cin,s1);
11         for(int j=0;j<s.length();++j) s[j]=tolower(s[j]);
12         for(int j=0;j<s1.length();++j) s1[j]=tolower(s1[j]);
13         if(s1.find(s+" ")==0) cout<<"case #"<<i<<":"<<endl<<1<<endl;
14         else if(s1.find(" "+s+" ")!=-1){
15             k=s1.find(" "+s+" ");
16             cout<<"case #"<<i<<":"<<endl<<k+2<<endl;
17         }
18         else if(s1.find(s+" ")!=-1) cout<<"case #"<<i<<":"<<endl<<s1.find(s+" ")+2<<endl;
19         else cout<<"case #"<<i<<":"<<endl<<"None"<<endl;
20     }
21 }

(以上1,3代码来自讨论区和数据区http://acm.ecnu.edu.cn/problem/3018/statistics/)

原文地址:https://www.cnblogs.com/Jiiiin/p/8589590.html