1. 程式人生 > >Leetcode 10. 正則表示式匹配

Leetcode 10. 正則表示式匹配

class Solution {
public:
    bool isMatch(string s, string p) {//p是有*.的
        bool dp[1005][1005];
        memset(dp, true, sizeof(dp));
        dp[0][0] = true;//s無字元,p無字元
        dp[0][1] = false;//s無字元,p有一個字元(且不能省略)
        for (int i = 1; i <= s.size(); ++i)
            dp[i][0] = false;//s有字元,p無字元
        for
(int j = 2; j <= p.size(); ++j)//Ax*只有A與空串匹配,且後兩個字元是x*的形式才匹配 dp[0][j] = (p[j - 1] == '*') && dp[0][j - 2]; for (int j = 1; j <= p.size(); ++j) for (int i = 1; i <= s.size(); ++i) { if (p[j - 1] != '*') //如果不是*,只有p遍歷到.或者p[j-1]和s[i-1]相等的時候匹配 dp[i][j] = dp[i - 1
][j - 1] && (p[j - 1] == '.' || s[i - 1] == p[j - 1]); else dp[i][j] = dp[i][j - 2] ||//x*表示0個x的情況 (dp[i - 1][j - 2] && (p[j - 2] == '.' || p[j - 2] == s[i - 1])) ||//x*表示1個x的情況 //x*表示多個x的時候表示,此時必須s[0~i-2]與p[0~j-1]匹配且…… (dp[i - 1
][j] && (p[j - 2] == '.' || p[j - 2] == s[i - 1])); } return dp[s.size()][p.size()]; } };