字符串匹配
问题描述
给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
输入格式
输入的第一行包含一个字符串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<cstring> using namespace std; /* 写一个函数判断两个字符串是否匹配,之后一个一个比较即可 */ //判断第二个字符串是否包含第一个 bool ismatch(string s1, string s2) { int n1 = s1.length(); int n2 = s2.length(); if (n1 > n2) return false; int a =0,b = 0; while (b < n2) { if (s1[a] == s2[b]) { a++; b++; } else { if (a == 0) b++; else a = 0; } if (a == n1) return true; } return false; } int main() { string s; cin >> s; int sense; cin >> sense; int n; cin >> n; string* strs = new string[n]; for (int i = 0; i < n; i++) { cin >> strs[i]; } if (sense) { for (int i = 0; i < n; i++) { if (ismatch(s, strs[i])) cout << strs[i] << endl; } } else { //先对字符串进行处理 for (int i = 0; i < s.length(); i++) { if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] + 'a' - 'A'; } for (int i = 0; i < n; i++) { string tmp = strs[i]; for (int j = 0; j < tmp.length(); j++) { if (tmp[j] >= 'A' && tmp[j] <= 'Z') tmp[j] = tmp[j] + 'a' - 'A'; } if (ismatch(s, tmp)) cout << strs[i] << endl; } } system("pause"); return 0; }
本题的关键点在于当第一个字符串的下标为0仍与字符2不匹配时,要令字符2下标右移;
但是字符1的下标不为0时的不匹配,要把字符1的下标置为0