CCF201409-3 字符串匹配

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

解题思路:用到了string的find()方法,因为规定字符串长度不会超过100,所以string 的find()函数查找的返回值不会超过100,超过100就是查找失败,基于这样的大思路。

我们来捋一下,首先大小写敏感的情况的话就不用说了,直接查找就可以了。

大小写不敏感的话我们可以把两个字符串全部转成小写(大写转小写+32,小写转大写-32,别问为什么,问就是去看ASCII码表),再查找就可以了,思路很简单,代码量也少。

这个题作为CCF第三题还挺简单,首先题目简洁好评哈哈哈哈。

贴一下一代码:

#include<iostream>
#include<string>

using namespace std;
/*
    str2为待匹配字符串,str1为模式串,不区分大小写判断是否存在匹配
*/
bool match(string str1, string str2) {
    //先将两个字符串中的字母全部化为小写
    for (int i = 0; i < str1.size(); i++) {
        if (str1[i] >= 'A'&&str1[i] <= 'Z') {
            str1[i] = str1[i] + 32;
        }
    }
    for (int i = 0; i < str2.size(); i++) {
        if (str2[i] >= 'A'&&str2[i] <= 'Z') str2[i] = str2[i] + 32;
    }
    //在第二个字符串中查找有没有匹配元素
    string::size_type n = str2.find(str1, 0);
    //cout << str1 << "   " << str2 << "   " << n << endl;
    if (n < 100) return true;
    return false;
}
int main() {
    string str;
    cin >> str;
    int flag;//大小写是否敏感标识,1标识敏感,0标识不敏感
    int n;//有几个待匹配字符串
    cin >> flag >> n;
    string pstr;//待匹配字符串
    for (int i = 0; i < n; i++) {
        cin >> pstr;
        if (flag) {
            //大小写敏感
            string::size_type n = pstr.find(str,0);
            if (n < 100) cout << pstr << endl;
        }
        else {
            //大小写不敏感
            if (match(str, pstr)) cout << pstr << endl;
        }
    }
    system("pause");
    return 0;
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!