T2-15 通配符匹配
2026-01-29 20:15:27
发布于:浙江
2阅读
0回复
0点赞
题意理解
给定文本串 和模式串 ,其中 ? 匹配任意单个字符,* 匹配任意字符序列(包括空串)。判断 能否完全匹配 。
思路分析
使用动态规划。
设 表示: 的前 个字符和 的前 个字符是否匹配。
状态转移:
-
若 是普通字符:
-
若 是
?(匹配任意单个字符): -
若 是
*(匹配任意序列):- :
*匹配空串 - :
*匹配至少一个字符
- :
边界条件:
- :空串匹配空模式
- 当且仅当 的前 个字符全是
*
答案:
参考代码
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2005; // 最大字符串长度
char S[MAXN], P[MAXN]; // 文本串和模式串
bool dp[MAXN][MAXN]; // dp[i][j]表示S前i个字符和P前j个字符是否匹配
int main() {
cin >> S >> P; // 读入文本串和模式串
int n = strlen(S), m = strlen(P); // 获取长度
dp[0][0] = true; // 边界:空串匹配空模式
for (int j = 1; j <= m; j++) { // 边界:空文本串匹配P的前j个字符
if (P[j - 1] == '*') { // 只有全是*才能匹配空串
dp[0][j] = dp[0][j - 1];
}
}
for (int i = 1; i <= n; i++) { // 枚举S的前i个字符
for (int j = 1; j <= m; j++) { // 枚举P的前j个字符
if (P[j - 1] == '*') { // *可以匹配任意序列
dp[i][j] = dp[i][j - 1] || dp[i - 1][j]; // 匹配空串或匹配至少一个字符
} else if (P[j - 1] == '?' || S[i - 1] == P[j - 1]) { // ?匹配任意单字符,或字符相同
dp[i][j] = dp[i - 1][j - 1];
}
}
}
cout << (dp[n][m] ? 1 : 0) << endl; // 输出答案
return 0;
}
这里空空如也


有帮助,赞一个