题解 | #字符串通配符#
字符串通配符
https://www.nowcoder.com/practice/43072d50a6eb44d2a6c816a283b02036
#include <iostream>
#include <vector>
#include <cctype>
using namespace std;
// 判断两个字符是否相等(不区分大小写)
bool charEquals(char a, char b) {
return tolower(a) == tolower(b);
}
// 判断字符是否为英文字母或数字
bool isValidChar(char c) {
return isalnum(c); // isalnum 用于判断字符是否为字母或数字
}
// 实现通配符匹配
bool isMatch(const string& pattern, const string& str) {
int m = pattern.size();
int n = str.size();
// dp[i][j] 表示 pattern 的前 i 个字符与 str 的前 j 个字符是否匹配
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
// 初始化 dp[0][0] 为 true,因为空模式和空字符串是匹配的
dp[0][0] = true;
// 处理 pattern 以 '*' 开始的情况,* 可以匹配空字符串
for (int i = 1; i <= m; i++) {
if (pattern[i - 1] == '*') {
dp[i][0] = dp[i - 1][0];
}
else {
break;
}
}
// 填充 dp 表格
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (pattern[i - 1] == '*') {
// '*' 可以匹配零个或多个字符
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
}
else if (pattern[i - 1] == '?') {
// '?' 必须匹配一个英文字母或数字
dp[i][j] = dp[i - 1][j - 1] && isValidChar(str[j - 1]);
}
else {
// 普通字符匹配,区分大小写
dp[i][j] = dp[i - 1][j - 1] && charEquals(pattern[i - 1], str[j - 1]);
}
}
}
// 返回最终结果
return dp[m][n];
}
int main() {
string pattern, str;
while (cin >> pattern >> str) {
if (isMatch(pattern, str)) {
cout << "true" << endl;
}
else {
cout << "false" << endl;
}
}
return 0;
}
