玩命加载中 . . .

字符串匹配


https://www.nowcoder.com/practice/fbdc522ef958455687654b38a4ca01e0?tpId=66&tqId=29633&tPage=1&ru=/kaoyan/retest/1004&qru=/ta/buaa-kaoyan/question-ranking

描述

读入数据string[ ],然后读入一个短字符串。要求查找string[ ]中和短字符串的所有匹配,输出行号、匹配字符串。匹配时不区分大小写,并且可以有多个用中括号表示的模式匹配。如“aa[123]bb”,就是说aa1bb、aa2bb、aa3bb都算匹配。

输入描述:

输入有多组数据。 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(不含空格),接下来输入一个匹配字符串。

输出描述:

输出匹配到的字符串的行号和该字符串(匹配时不区分大小写)。

示例1

输入:

4
Aab
a2B
ab
ABB
a[a2b]b

输出:

1 Aab
2 a2B
4 ABB
#define _CRT_SECURE_NO_WARNINGS 1
#include <bits/stdc++.h>
using namespace std;

const int N = 1e3 + 10;
string texts[N];
string pattern;

bool Equal(char x, char y) {
	if (isalpha(x) && isalpha(y))
		return toupper(x) == toupper(y);
	else
		return x == y;
}

bool Match(string text, string pattern) {
	for (int i = 0, j = 0; i < text.size() && j < pattern.size(); ++i, ++j) {
		bool flag = false;
		if(pattern[j] == '['){
			for (; pattern[j] != ']'; ++j) {
				if (Equal(text[i], pattern[j]))
					flag = true;
			}
		}
		else if (Equal(text[i], pattern[j]))
			flag = true;
		if (!flag)
			return false;
	}
	return true;
}

int main() {
	int n;
	while (cin >> n)
	{
		for (int i = 0; i < n; ++i)
			cin >> texts[i];
		cin >> pattern;
		for (int i = 0; i < n; ++i) {
			if (Match(texts[i], pattern))
				cout << i + 1 << " " << texts[i] << endl;
		}
	}
	return 0;
}

文章作者: Jack Tim
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Tim !
评论
  目录