ccf 字符串匹配

来源:互联网 发布:特别想找个女朋友知乎 编辑:程序博客网 时间:2024/06/05 02:36
问题描述
  给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入格式
  输入的第一行包含一个字符串S,由大小写英文字母组成。
  第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
  第三行包含一个整数n,表示给出的文字的行数。
  接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
输出格式
  输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
样例输入
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello
样例输出
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
样例说明
  在上面的样例中,第四个字符串虽然也是Hello,但是大小写不正确。如果将输入的第二行改为0,则第四个字符串应该输出。
评测用例规模与约定

  1<=n<=100,每个字符串的长度不超过100。


代码仅供参考:

#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>using namespace std;const int size = 101;typedef bool (*cmpfunc)(char, char);inline bool ign_cmp(char a, char b){//printf("a = %c\n", a);//printf("b = %c\n", b);//printf("a - b = %d\n", (a - b));//printf("abs(a-b) = %d\n", abs(a - b));//printf("'a' - 'A' = %d\n", 'a' - 'A');if (a == b) return true;return abs((int)(a - b)) == (int)('a' - 'A');}inline bool cmp(char a, char b){return a == b;}bool compare(char *a, char *b, bool is_ign){int i = 0, j = 0;cmpfunc func;int len_a = strlen(a); // int len_b = strlen(b);if (is_ign) func = cmp; // 等于1时不忽略大小写 else func = ign_cmp; // 否则忽略大小写 while (j <= len_b){if (i >= len_a) // 当 return true;if (func(b[j], a[i])){j++;i++;}else{j++;i = 0;}}return false;}int main(){char str[size];char input[size];int is_ign;int n; // 输入的字符串的个数 std::cin >> str;std::cin >> is_ign;std::cin >> n;while(n--){std::cin >> input; // 输入字符串if (compare(str, input, is_ign)) std::cout << input << endl;}return 0;}


0 0
原创粉丝点击