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/)

  • 相关阅读:
    D365FO Debug找不到w3cp进程
    D365FO 10.0PU32 开发环境 Data Management导出失败
    一张图看懂项目管理
    用户体验为什么重要?如何提升产品的用户体验?(写给产品小白)
    敏捷考证?你应该知道的敏捷体系认证(最全名单)
    漫画:禅道程序员的一天
    敏捷开发管理--任务分解经验之谈
    漫画:优秀程序员的必备特质有哪些?
    漫画:女生/男生告白攻略
    漫画:程序员脱单秘籍
  • 原文地址:https://www.cnblogs.com/Jiiiin/p/8589590.html
Copyright © 2011-2022 走看看