• LeetCode10. Regular Expression Matching


      题目:题目链接

      题意:给出两个字符串s和p,问是否能够完全匹配,其中s只包括小写字母,p除了可能包括小写字母外还含有字符'.'和'*','.'可以匹配任意字母,'*'表示其前面的那个字符可以有任意个(可以为0个)

      思路:类比LCS(最长公共子序列)问题,我们很容易想到该题的动态规划解题思路。对于该题我们采用二维dp,dp[i][j]表示s前i个字符是否可以与p前j个字符完全匹配,递推关系如下:

        1)  dp[0][0]=true;    

        2)  如果j > 1 && p[j - 1] == '*':dp[i][j] = dp[i][j - 2] || (i > 0 && (s[i - 1] == p[j - 2] || p[j - 2] == '.') && dp[i - 1][j]);

        3)  else :dp[i][j] = i > 0 && dp[i - 1][j - 1] && (s[i - 1] == p[j - 1] || p[j - 1] == '.');

      PS:重新刷题立马又感受到了英语对我深深的恶意,一开始又把题目读错了,以为只要s是p扩容后的子序列就行,直接导致第一次在leetcode上收获熟悉的wrong answer一枚,看了题解才发现读错了题,我真是太沙雕了

      ac代码如下:

     1 class Solution {
     2 public:
     3     bool isMatch(string s, string p) {
     4         int n = s.size(), m = p.size();
     5         vector< vector<bool> > ans(n + 1, vector<bool>(m + 1, false) );
     6         ans[0][0] = true;
     7         for(int i = 0; i <= n; ++i) {
     8             for(int j = 1; j <= m; ++j) {
     9                 if(j > 1 && p[j - 1] == '*')
    10                     ans[i][j] = ans[i][j - 2] || (i > 0 && (s[i - 1] == p[j - 2] || p[j - 2] == '.') && ans[i - 1][j]);
    11                 else
    12                     ans[i][j] = i > 0 && ans[i - 1][j - 1] && (s[i - 1] == p[j - 1] || p[j - 1] == '.');
    13             }
    14         }
    15         return ans[n][m];
    16     }
    17 };
  • 相关阅读:
    B-Tree和B+Tree的区别
    b树和hash树的应用场景
    比较顺序表和链表的优缺点,说说它们分别在什么场景下使用?
    5V与3.3V电平互转
    100M双绞线接头的标准接法
    解决openwrt中文界面异常
    刚刚开通了博客
    openwrt挂载摄像头及视频保存
    mwan3多wan叠加成功
    贝尔金(Belkin)7231-4P tftp救砖
  • 原文地址:https://www.cnblogs.com/fan-jiaming/p/11823951.html
Copyright © 2020-2023  润新知