1. 程式人生 > 資訊 >騰訊宣佈:獨家代理育碧《全境封鎖 2 》國服

騰訊宣佈:獨家代理育碧《全境封鎖 2 》國服

示例 1:

輸入:
s = "aa"
p = "a"
輸出: false
解釋: "a" 無法匹配 "aa" 整個字串。

示例 2:

輸入:
s = "aa"
p = "a*"
輸出: true
解釋: 因為 '*' 代表可以匹配零個或多個前面的那一個元素, 在這裡前面的元素就是 'a'。因此,字串 "aa" 可被視為 'a' 重複了一次。

用二維陣列dp來表示字串s前i個字元和字串p前j個字元是否匹配

狀態轉移方程

  1. 如果字串p的第j個字元不為'*',dp [i] [j] = dp [i-1] [j-1]
  2. 如果字串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];
    }
};