题解 | #正则表达式匹配#

正则表达式匹配

https://www.nowcoder.com/practice/28970c15befb4ff3a264189087b99ad4

膜拜大佬题解

https://www.bilibili.com/video/BV1CK411c7gx?p=16

过程分析

  • str的长度是mpattern的长度是n
  • F(i,j)的含义表示:
  • str的前istr[0,i-1]
  • pattern的前jpattern[0,j-1]是匹配的
  • 情况:
  • p[j-1] = . 或者 p[j-1]= xx表示任意一个小写字母,假如x=a。此时只要S[i-1]=a或者p[j-1]=.就可以转换成子问题

  • 如果S[i-1] != a直接返回false
  • 如果p[j-1] = *,则需要考虑到p[j-2]

  • 如果S[i-1] == p[j-2],或者 p[j-2] == .则需要匹配

  • 初始化问题
  • s为空,p为空,返回true,则dp[0][0] = true
  • s不空,p为空,均为false,则dp[i][0] = false
  • p不空,则需要计算

代码

#include <vector>
class Solution {
public:
    bool match(string str, string pattern) {
        int m = str.length();
        int n = pattern.length();
        vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
        dp[0][0] = true;
        for (int i = 2; i <= n; ++i) {
            if (pattern[i-1] == '*') {
                dp[0][i] = dp[0][i-2];
            }
        }
        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (pattern[j-1] != '*' && (pattern[j-1] == '.' || pattern[j-1] == str[i-1])) {
                    dp[i][j] = dp[i-1][j-1];
                }
                else if (j >= 2 && pattern[j-1] == '*') {
                    if (pattern[j-2] == '.' || pattern[j-2] == str[i-1]) {
                        dp[i][j] = dp[i-1][j] || dp[i][j-2];
                    } else {
                        dp[i][j] = dp[i][j-2];
                    }
                }
            }
        }
        return dp[m][n];
    }
};

2023-剑指-DP 文章被收录于专栏

2023-剑指-DP

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:28
点赞 评论 收藏
分享
牛客771574427号:恭喜你,华杰
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务