• CCF201409-3 字符串匹配(100分)


    试题编号: 201409-3
    试题名称: 字符串匹配
    时间限制: 1.0s
    内存限制: 256.0MB
    问题描述:
    问题描述
      给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
    输入格式
      输入的第一行包含一个字符串S,由大小写英文字母组成。
      第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
      第三行包含一个整数n,表示给出的文字的行数。
      接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
    输出格式
      输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
    样例输入
    Hello
    1
    5
    HelloWorld
    HiHiHelloHiHi
    GrepIsAGreatTool
    HELLO
    HELLOisNOTHello
    样例输出
    HelloWorld
    HiHiHelloHiHi
    HELLOisNOTHello
    样例说明
      在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。
    评测用例规模与约定
      1<=n<=100,每个字符串的长度不超过100。

    问题链接:CCF201409试题

    问题描述:(参见上文)。

    问题分析:这是一个简单的字符串处理问题,关键是对有关字符串处理函数是否熟悉。

    程序说明:有关字符串的处理,可以用C语言的函数实现,也可用C++的string变量实现。

    相关链接:CCF201409-3 字符串匹配(解法二)(100分)


    提交后得100分的C++语言程序如下:

    /* CCF201409-3 字符串匹配 */
    
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    const int N = 100;
    
    void mystrlwr(char *ps)
    {
        while(*ps) {
            if('A' <= *ps && *ps <= 'Z')
                *ps += 'a'-'A';
            ps++;
        }
    }
    
    int main()
    {
        char key[N+1], s[N+1], lowerkey[N+1], lowers[N+1];
        int option, n;
    
        // 输入数据
        cin >> key >> option >> n;
    
        // 获得key的小写字符串,放在变量lowerkey中
        strcpy(lowerkey, key);
        mystrlwr(lowerkey);
    
        // 循环处理
        for(int i=1; i<=n; i++) {
            cin >> s;
    
            if(option == 0) {   // 大小写无关
                strcpy(lowers, s);
                mystrlwr(lowers);
    
                if(strstr(lowers, lowerkey))
                    cout << s << endl;
            } else { // option = 1,大小写有关
                if(strstr(s, key))
                    cout << s << endl;
            }
        }
    }

    在gcc环境中,不支持函数strlwr(),所以需要自己写一个函数mystrlwr(),在Dev-C++环境中,是支持函数strlwr()的,不需要自己写该函数,上述的函数mystrlwr()可以直接写为strlwr()


    以下这个程序提交后只得了50分,希望哪位帮助改进一下:

    经过网友指正,修改后程序已经得100分。多种不同的做法,使用的编程技术是不一样的。程序员需要多备几种技术和方法,根据不同的环境和需求编写相应的程序。

    /* CCF201409-3 字符串匹配 */
    
    #include <iostream>
    #include <cctype>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        string key, s, kt, st;
        int option, n;
    
        // 输入数据
        cin >> key >> option >> n;
    
        // 获得key的小写字符串,放在变量kt
        kt = s;
        for(int i=0; i<(int)kt.size(); i++)
            if(isupper(kt[i]))
                kt[i] = tolower(kt[i]);
    
        // 循环处理
        for(int i=1; i<=n; i++) {
            cin >> s;
    
            if(option == 0) {   // 大小写无关
                st = s;
                for(int i=0; i<(int)st.size(); i++)
                    if(isupper(st[i]))
                        st[i] = tolower(st[i]);
    
                int pos = st.find(kt);
                if(pos >= 0)
                    cout << s << endl;
            } else { // option = 1,大小写有关
                int pos = s.find(key);
                if(pos >= 0)
                    cout << s << endl;
            }
        }
    
        return 0;
    }

    修改上述程序的BUG,提交后得100分的C++语言程序如下:

    /* CCF201409-3 字符串匹配 */
    
    #include <iostream>
    #include <cctype>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        string key, s, kt, st;
        int option, n;
    
        // 输入数据
        cin >> key >> option >> n;
    
        // 获得key的小写字符串,放在变量kt
        kt = key;
        for(int i=0; i<(int)kt.size(); i++)
            if(isupper(kt[i]))
                kt[i] = tolower(kt[i]);
    
        // 循环处理
        for(int i=1; i<=n; i++) {
            cin >> s;
    
            if(option == 0) {   // 大小写无关
                st = s;
                for(int i=0; i<(int)st.size(); i++)
                    if(isupper(st[i]))
                        st[i] = tolower(st[i]);
    
                int pos = st.find(kt);
                if(pos >= 0)
                    cout << s << endl;
            } else { // option = 1,大小写有关
                int pos = s.find(key);
                if(pos >= 0)
                    cout << s << endl;
            }
        }
    
        return 0;
    }



  • 相关阅读:
    JAVA-初步认识-第十三章-验证静态同步函数的锁
    JAVA-初步认识-第十三章-多线程(验证同步函数的锁)
    JAVA-初步认识-第十二章-面向对象(包与包之间的访问)
    JAVA-初步认识-第十二章-面向对象(包的概述)
    JAVA-初步认识-第十三章-同步函数
    Fatal error: Call to undefined function imagettftext()解决办法
    ecstore菜鸟电子面单对接摘要
    linux crontab 实现每秒执行(转)
    ios9 URL Schemes列为白名单,才可正常检查其他应用是否安装
    主机宝等主机面板不能跨站访问文件,不能访问父路径文件问题
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564168.html
Copyright © 2020-2023  润新知