LeetCode10. Regular Expression Matching

  题目:题目连接express

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

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

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

    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]);leetcode

    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一枚,看了题解才发现读错了题,我真是太沙雕了get

  ac代码以下:string

 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 };
相关文章
相关标签/搜索