LeetCode - Regular Expression Matching

xiaoxiao2025-04-27  16

解法一:recursion

class Solution { public: bool isMatch(string s, string p) { if(s.empty()){ if(p.empty()) return true; if(p.size()>=1 && p[1]=='*') return isMatch(s, p.substr(2)); return false; }else if(p.empty()) return false; if(p.size()>1 && p[1]=='*'){ if(p[0]==s[0]|| p[0]=='.') return isMatch(s.substr(1), p)||isMatch(s, p.substr(2)); else return isMatch(s, p.substr(2)); } if(s[0]==p[0] || p[0]=='.') return isMatch(s.substr(1), p.substr(1)); else return false; } };

解法二:DP

class Solution { public: bool isMatch(string s, string p) { int m = s.size(); int n = p.size(); vector<vector<bool>> dp(m+1, vector<bool>(n+1, false)); dp[0][0] = true; for(int i=0;i<=m;i++){ for(int j=1;j<=n;j++){ if(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]); }else{ dp[i][j] = i>0 && dp[i-1][j-1] && (s[i-1]==p[j-1]||p[j-1]=='.'); } } } return dp[m][n]; } };

i - number of s string element

j - number of p string element

Condition 1: p current is "*"

p previous and p current --> nothing ("a*"->"")               dp[i][j] = dp[i][j-2]

p previous --> s current ("a*"->"a" || ".*"->"a")                dp[i][j] = dp[i-1][j] && (s[i-1]==p[j-2] || p[j-2]=='.')

not dp[i-1][j-2] 因为前面也许有elements map to “a*”; if not, nothing can also be mapped to "a*"

Condition 2: p current is not "*"

p current --> s current  ("a"->"a" || "."->"a")                     dp[i][j] = dp[i-1][j-1] && (s[i-1]==p[j-1] || p[j-1]=='.')

转载请注明原文地址: https://www.6miu.com/read-5029237.html

最新回复(0)