字符串匹配(2008年北京航空航天大学计算机研究生机试真题)

题目描述:
读入数据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 }

 

posted @ 2013-02-21 22:23  babyron  阅读(236)  评论(0)    收藏  举报