【题目链接】:
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 };