問題:https://leetcode.com/problems/wildcard-matching/
メモリ検索でエラーを起こしやすいしませんでした。
クラスのソリューション{ パブリック: ベクトル <ベクトル< int型 >> DP; BOOL isMatch(CONST 文字列&S、CONST 文字列&P、int型 I、INT J) { 場合(I> = s.size()&& J> = p.size())を返す 真。 もし(J> = p.size())を返す 偽。 もし(!DP [I] [J] = 2)リターンDP [I] [J]。 あれば(私はs.size()&&(S [i]を== P [J] || P [J] == < " ?' )) { 戻り DP [I] [J] = isMatch(S、P、I + 1、J + 1 )。 } もし(P [j] == ' * ' ) { ための(int型 ; kは<= s.size(); K = IをK ++ ) { 場合(isMatch(S、P、K、J + 1))を返す DPを[I] [j]は= 真。 } } 戻り DP [i]は[J] = 偽。 } BOOL isMatch(ストリング S、文字列P){ dp.resize(s.size() + 1、ベクトル< INT >(p.size()+ 1、2 ))。 戻り isMatch(S、P、0、0 ); } }。
非再帰:
クラスのソリューション{ パブリック: ベクトル <ベクトル< ブール >> DP; BOOL isMatch(ストリング S、ストリングP){ dp.resize(s.size() + 1、ベクトル< BOOL >(p.size()+ 1 ))。 DP [ 0 ] [ 0 ] = 真。 用(int型 iは= 1 ; I <= s.size()iが++ ) { DP [I] [ 0 ] = 偽。 } のために(INT J = 0 ; J <p.size(); J ++ ) { 場合(P [j] == ' * ')DP [ 0 ] [J + 1 ] = 真。 他に 休憩; } のための(int型 I = 0 ; iが(s.sizeを<); iが++ ) { ため(INT J = 0 ; J <p.size(); J ++ ) { 場合(P [j] == ' * ' ) { DP [私は +1 ] [J + 1 ] = DP [I + 1 ] [J] || DP [I]、[J + 1 ]。 } 他 { DP [I + 1 ] [j + 1 ] =(S [I] == P [J] || P [J] == ' ?')&& DP [I] [J]。 } } } 戻りDP [s.size()] [p.size()]。 } }。