- 题目描述:
- 读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。
- 输入:
- 输入有多组数据。
- 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。
- 输出:
- 输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。
- 样例输入:
- 4
- Aab
- a2B
- ab
- ABB
- a[a2b]b
- 样例输出:
- 1 Aab
- 2 a2B
- 4 ABB
- 提示:注意[]中只能出现一个匹配字符,既不能是空也不能多于一个,剩下的基本就可以暴力做了
1 #include <cstdio>
2 #include <cstring>
3 #include <string>
4 using namespace std;
5
6 char str[1001][101];
7 char str2[100];
8 string tmp, pai;
9 int a, b;
10 bool p;
11 int main() {
12 int n, size;
13 while (~scanf("%d", &n)) {
14 for (int i = 1; i <= n; i++)
15 scanf("%s", str[i]);
16 scanf("%s", str2);
17 pai = str2;
18 for (int i = 0; i < pai.size(); i++)
19 pai[i] = tolower(pai[i]);
20 a = pai.find('[', 0);
21 pai.erase(a, 1);
22 b = pai.find(']', a);
23 pai.erase(b, 1);
24 for (int i = 1; i <= n; i++) {
25 p = true;
26 tmp = str[i];
27 size = tmp.size();
28 for (int j = 0; j < size; j++)
29 tmp[j] = tolower(tmp[j]);
30 if (size + b - a - 1 != pai.size())
31 continue;
32 int t = pai.find(tmp[a], a);
33 if (t >= b || t == -1)
34 continue;
35 for (int j = 0; j < a; j++)
36 if (tmp[j] != pai[j]) {
37 p = false;
38 break;
39 }
40 if (p) {
41 for (int j = a + 1; j < size; j++)
42 if (tmp[j] != pai[j + b - a - 1]) {
43 p = false;
44 break;
45 }
46 }
47 if (p)
48 printf("%d %s\n", i, str[i]);
49 }
50 }
51 return 0;
52 }