含ま一致する機能を実装してください'.'
し、'*'
正規表現を。
文字パターンは、'.'
任意の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 \)最高の人のレベルを反映思考。