问题描述
给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入格式
输入的第一行包含一个字符串S,由大小写英文字母组成。
第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字的行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字的行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
输出格式
输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
样例输入
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
样例输出
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
HiHiHelloHiHi
HELLOisNOTHello
样例说明
在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。
评测用例规模与约定
1<=n<=100,每个字符串的长度不超过100。
#include <iostream> #include <string> using namespace std; int Index_BF(char S[], char T[], int choice) { /* 若串 S 中从第pos(S 的下标0≤pos个字符 起存在和串 T 相同的子串,则称匹配成功,返回第一个 这样的子串在串 S 中的下标,否则返回 -1 */ int i = 0, j = 0; while (S[i + j] != '\0'&& T[j] != '\0') { char tmp = S[i+j]; if (choice == 0) { if (S[i + j] >= 'A' && S[i + j] <= 'Z') tmp = S[i + j] + 32; } if (tmp == T[j]) j++; // 继续比较后一字符 else { i++; j = 0; // 重新开始新的一轮匹配 } } if (T[j] == '\0') return i; // 匹配成功 返回下标 else return -1; // 串S中(第pos个字符起)不存在和串T相同的子串 } // Index_BF struct Data{ char str[100]; bool flag; Data() { memset(str, 0, 100); flag = false; } }; Data data[101]; void main(void) { int n; int choice; char str[100]; while (cin >> str) { cin >> choice; cin >> n; for (int i = 0; i < n; i++) cin >> data[i].str; if (choice == 0){ int len = strlen(str); int i = 0; while (str[i] != '\0') { if (str[i] >= 'A' && str[i] <= 'Z') str[i] += 32; i++; } } cout << endl; for (int j = 0; j < n; j++) { if (Index_BF(data[j].str, str, choice)!=-1) cout << data[j].str << endl; } memset(str, 0, 100); } }
对于模式匹配还可以用KMP算法,效率更好!
写代码是一种艺术,甚于蒙娜丽莎的微笑。