题目## 题目## 题目
解题思路
这是一个字符串匹配问题,可以使用动态规划来解决。关键点:
-
状态定义:
- d p [ i ] [ j ] dp[i][j] dp[i][j] 表示字符串 A A A 的前 i i i 个字符是否能被字符串 B B B 的前 j j j 个字符匹配。
-
状态转移:
- 如果当前字符匹配( A [ i − 1 ] = = B [ j − 1 ] A[i-1] == B[j-1] A[i−1]==B[j−1] 或 $B[j-1] == ‘.’),则:
- d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] dp[i][j] = dp[i-1][j-1] dp[i][j]=dp[i−1][j−1]
- 如果 B [ j − 1 ] B[j-1] B[j−1] 是 ‘*’,则:
- d p [ i ] [ j ] = d p [ i ] [ j − 2 ] dp[i][j] = dp[i][j-2] dp[i][j]=dp[i][j−2] // '*'表示前一个字符出现0次
- d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j] = dp[i-1][j] dp[i][j]=dp[i−1][j] // '*'表示前一个字符出现1次或多次(前一个字符必须与A[i-1]匹配)
- 如果当前字符匹配( A [ i − 1 ] = = B [ j − 1 ] A[i-1] == B[j-1] A[i−1]==B[j−1] 或 $B[j-1] == ‘.’),则:
-
初始化:
- d p [ 0 ] [ 0 ] = t r u e dp[0][0] = true dp[0][0]=true,表示两个空字符串匹配。
- 处理 B B B 中 ‘*’ 的情况,初始化 d p [ 0 ] [ j ] dp[0][j] dp[0][j]。
代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class WildMatch {
public:
bool chkWildMatch(string A, int lena, string B, int lenb) {
vector<vector<bool>> dp(lena + 1, vector<bool>(lenb + 1, false));
dp[0][0] = true; // 两个空字符串匹配
// 初始化B的情况
for (int j = 1; j <= lenb; j++) {
if (B[j - 1] == '*') {
dp[0][j] = dp[0][j - 2]; // '*'表示前一个字符出现0次
}
}
// 动态规划填表
for (int i = 1; i <= lena; i++) {
for (int j = 1; j <= lenb; j++) {
if (A[i - 1] == B[j - 1] || B[j - 1] == '.') {
dp[i][j] = dp[i - 1][j - 1]; // 当前字符匹配
} else if (B[j - 1] == '*') {
dp[i]

最低0.47元/天 解锁文章
767

被折叠的 条评论
为什么被折叠?



