[AcWing30]の正規表現マッチ

[AcWing30]の正規表現マッチ

含ま一致する機能を実装してください'.'し、'*'正規表現を。
文字パターンは、'.'任意の1つの文字を表す'*'(0時間を含む)任意の回数とすることができる文字の前に示されています。
たとえば、文字列"aaa"パターンを持つ"a.a""ab*ac*a"一致しますが、と"aa.a"とは"ab*a"一致しません。

class Solution{
public:
    bool isMatch(string s, string p){
        
    }
};

これは、タイトルデータの範囲を与えていません

良心の問題解決

配置されたように(S \)\長さの\(N- \) \(P \)の長さ\(m個\) \(F [I] [J] \)を表し\(P [j、m]を \) 一致させることができる(S [I、N-] \)\
\(1 \)であれば\(P [+ J. 1] \) \(!= \) ' \(* \)、' \(F [Iを] [j]は\)場合にのみ真である\(S [I] \)することができる\(P [J] \)一致、及び\が(F [I + 1] [j + 1] \) 真であります。
\(2 \)場合\(P [+ J. 1] \) \(== \) ' \(* \) ' \([I]、[J F \]) 二つの可能な場合があります真:
" \(* \) "を表す\(0 \)\(P [J] \)相当し\(F [I] [jが + 2] \) 真である
" (* \)\数を表し、" \(Pは[J] \)、$ Fに相当する[I + 1] [ J]は真$と\(sが[i]は\)することができた(p [j]が\)\一致した
後、トータルのメモリ使用することができます\(NM \)の状態を、時間の複雑\(O(NM )\)

class Solution{
public:
    vector<vector<int>> f;
    int n, m;
    bool isMatch(string s, string p){
        n = s.size(), m = p.size();
        f = vector<vector<int>>(n + 1, vector<int>(m + 1, -1));
                          // f = n+1个 ((m+1个-1)组成的vector)
        return dp(0, 0, s, p);
    }
    inline bool dp(int x, int y, string& s, string& p){
        if(x > n || y > m) return 0;
        if(f[x][y] != -1) return f[x][y];
        if(y == m)
            return f[x][y] = (x ==n);
        bool now_match = ((s[x] == p[y]) || (p[y] =='.'));
        bool ans;
        if(p[y + 1] == '*')
            ans = dp(x, y + 2, s, p) || (now_match && dp(x + 1, y, s, p));
        else
            ans = now_match && dp(x + 1, y + 1, s, p);
        return f[x][y] = ans;
    }
};

思考の練習良い質問、\(DP \)最高の人のレベルを反映思考。

おすすめ

転載: www.cnblogs.com/lizehon/p/11200149.html