1. 程式人生 > >EOJ 3018 查找單詞

EOJ 3018 查找單詞

ont ios 16px cin gpo AC 完全 i++ 出現

有一個單詞 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:\nNone\n", s); 49   else 50   { 51   int pos = p - sen + 1; 52   printf("case #%d:\n%d\n", 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\n",&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:\nNone\n",m);
33         else printf("case #%d:\n%d\n",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/)

EOJ 3018 查找單詞