zoukankan      html  css  js  c++  java
  • 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/)

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    《EffectiveJava中文第二版》 高清PDF下载
    《MoreEffectiveC++中文版》 pdf 下载
    《啊哈c语言》 高清 PDF 下载
  • 原文地址:https://www.cnblogs.com/Jiiiin/p/8589590.html
Copyright © 2011-2022 走看看