有一个单词 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/)