问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。 输入格式 输入的第一行包含一个字符串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; }
来源:https://www.cnblogs.com/syq816/p/12369419.html