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

匿名 (未验证) 提交于 2019-12-02 23:55:01

【题目链接】:

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 };

 

来源: https://www.cnblogs.com/Osea/p/11380772.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!