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



  • 相关阅读:
    JDBC 复习4 批量执行SQL
    JDBC 复习3 存取Oracle大数据 clob blob
    Oracle复习
    Linux命令(1)grep
    JDBC 复习2 存取mysql 大数据
    JDBC 复习1 DBUtil
    php 环境搭建问题
    Windows 批处理 bat 开启 WiFi 菜单选项 设置ID PWD
    Bat 批处理启动和停止Oracle 服务
    docker 学习1 WSL docker ,Windows docker
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564168.html
Copyright © 2011-2022 走看看