【动态规划】正则表达式匹配

【题目链接】:

https://www.acwing.com/problem/content/28/

 

【题目解释】

请实现一个函数用来匹配包括'.''*'的正则表达式。

模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。

在本题中,匹配是指字符串的所有字符匹配整个模式。

例如,字符串"aaa"与模式"a.a""ab*ac*a"匹配,但是与"aa.a""ab*a"均不匹配。

样例

输入:

s="aa"
p="a*"

输出:true

【参考】y总的视频讲解。

分3种情况来讨论问题,f[i][j] 以i为结尾的s串是否匹配以j为结尾的p串。

 

具体可以看代码:

 

 1 /*
 2 s="aa"
 3 p="a*"
 4 
 5 f[i][j] 指的是: s[i,...] p[j,...] 相匹配
 6 
 7 1. 当p[i] 是正常的字符 , s[i] == p[j] , f[i][j] = f[i+1][j+1]
 8 2. 当p[i] = '.' ,  f[i][j] = f[i+1][j+1]
 9 3. 当p[i+1] = '*' ,f[i][j] = f[i][j+2] || f[i+1][j]
10 
11 
12 边界问题 : f[n][m] = true;
13 */
14 
15 
16 
17 class Solution {
18 public:
19     string s , p  ;
20     vector< vector<int > > f ;
21     int n, m ;
22     bool isMatch(string _s, string _p) {
23         s = _s , p = _p ;
24         n = s.length() , m = p.length() ;
25         f = vector<vector<int>>( n+2 , vector<int> ( m+2 , -1 ) );
26         return dp(0,0);
27     }
28     bool dp(int x,int y){
29         if( f[x][y] != -1 ) return f[x][y] ;
30         if( y == m )    return (f[x][y] = (x==n));
31         bool First = (x < n && (p[y] == '.' || s[x] == p[y]) ) ; 
32         
33         if( y+1 < m && p[y+1] == '*' ){
34             f[x][y] = dp(x,y+2) || First && dp(x+1,y);
35         }else{
36             f[x][y] =  First && dp(x+1,y+1);
37         }
38         return f[x][y];
39     }
40 };

 

 

 

 

 

 
posted @ 2019-08-20 02:19  Osea  阅读(418)  评论(2编辑  收藏  举报