騰訊宣佈:獨家代理育碧《全境封鎖 2 》國服
阿新 • • 發佈:2021-07-09
示例 1:
輸入:
s = "aa"
p = "a"
輸出: false
解釋: "a" 無法匹配 "aa" 整個字串。
示例 2:
輸入:
s = "aa"
p = "a*"
輸出: true
解釋: 因為 '*' 代表可以匹配零個或多個前面的那一個元素, 在這裡前面的元素就是 'a'。因此,字串 "aa" 可被視為 'a' 重複了一次。
用二維陣列dp來表示字串s前i個字元和字串p前j個字元是否匹配
狀態轉移方程
- 如果字串p的第j個字元不為'*',dp [i] [j] = dp [i-1] [j-1]
- 如果字串p的第j個字元為'*'
- 字串s的第i個字元和字串p的第j-1個字元不相等,直接砍掉正則串的後面兩個,dp [i] [j] = dp [i] [j-2]
- 字串s的第i個字元和字串p的第j-1個字元相等,主串前移一個,dp [i] [j] = dp [i-1] [j]
初始條件
- 空串和空正則是匹配的,f [0] [0] = true
- 空串和非空正則,不能直接定義 true 和 false,必須要計算出來。
- 非空串和空正則必不匹配,f [1] [0]=...=f [n] [0]= false
- 非空串和非空正則,那肯定是需要計算的了。
class Solution { public: bool isMatch(string s, string p) { int m = s.size(); int n = p.size(); vector<vector<int>> dp(m+1,vector<int>(n+1,false)); dp[0][0]=true; for(int i=0; i<=m; i++){ for(int j=1; j<=n; j++){ if(p[j-1]!='*'){ if(i>0&&(s[i-1]==p[j-1]||p[j-1]=='.')) dp[i][j]=dp[i-1][j-1]; } else{ if(i>0&&(s[i-1]==p[j-2]||p[j-2]=='.')){ dp[i][j]=dp[i-1][j]; } if(j>1) dp[i][j]|=dp[i][j-2]; } } } return dp[m][n]; } };