この問題は、一年前やったブラシleetcodeに始まった、チューブを入れていなかったトラブルの数十を、提出しました。今日は、この問題が発生したのオファーを獲得し、最終的に出て来た、使用DP。
1 クラスソリューション{ 2 公共: 3。 BOOL IsMatch(ストリング S、文字P){ 4。 INT s_len s.size =()= p_len P.SIZE(); 5。 ベクトル<ベクトル< BOOL >> DP(+ s_len 1。 、ベクトル< BOOL >(+ p_len 1、偽に)); 6 // DP [I] [J]は、Sを表し、[0、I-1]、P [0、J-1]が合うことができる 7。 DP [ 0 ] [ 0 ] = trueに ; // 空の文字列は空の文字列にマッチする 8。 のために(int型iは= 1 ; I <= p_len; ++ I){ 9 DP [ 0 ] [I] = I> 1およびP [I- 1 ] == ' * 'およびDP [ 0 ] [I- 2 ]。 10 } 11 のために(INT iは= 1 ; iが<= s_len; ++ I){ 12 のために(INT J = 1 ; J <= p_len; ++ j)は{ 13 であれば(P [J- 1 ] == ' * ' ){ 14 であれば(P [J- 2 ]!=" 。'){ // 数字+' *」 15 DP [I] [J] = DP [I]、[J- 2 ]又は(S [I- 1 ] == P [J- 2 ]及び(DP [1- 1 ] [J- 2 ]又はDP [I- 1 ] [J- 1 )])。 16 } 17 他 { // + '* ''' 18 のための(int型 K = I、K> = 0 ; - K){ 19 であれば(DP [K] [J- 2 ]){ 20 、DP [I ] [J] = 真。 21 ブレーク; 22 } 23 } 24 } 25 } 26 他の 場合(P [J- 1 ] == ' ' ){ 27 、DP [I] [J] = DP [I- 1 ] [J- 1 ]。 28 } 29 他 { // 数字30 DP [I] [J] = P [J- 1 ] == S [I- 1 ]とDP [I- 1 ] [J- 1 ]。 31 } 32 } 33 } 34 リターンdp.back()バック()。 35 } 36 }。