30.正規表現のマッチングをAcWing(安全オファーleetcode 10を証明します)

タイトル説明
実装は、式の「及びn「*」」と一致する機能を備えています。

モード文字が「」 『*』任意の1つの文字を表し前の文字が(0時間を含む)任意の回数現れることができることを示しています。

この問題では、試合全体のパターンが文字列のすべての文字に一致しています。

たとえば、文字列「AAA」モードと「AA」と「アバカ」試合が、「aa.a」と「abが*」一致しません。

サンプル

入力:

S = " AA " 
P = " A * " 

出力:trueに

アルゴリズム1つの
古典的なタイトルが非常に困難です。
動的プログラミング
DP [i] [j]はSかどうかを示す[0〜I)の文字列にマッチするPの文字列[0〜j)は
、次のスイッチング状態を有する
1つのP [J-1]と文字をS [I-1]、現在DP [i] [j]が一致するがDPに依存し、同じである[I-1] [J-1]
2 P [J-1]が少ない一定とsである[I-1 ]現在のDPに等しい[i] [j]が一致DPに依存するであろう[I-1] [J -1]
同様の12は一緒に基づいて、ここでコードに
3 P [J-1]の表現の前に、その後で文字または繰り返し反復2例0
3.1 0を、それが現在の反復P [J-1] == 'である場合 *' およびp [j-2]は無視することができます。次にDP [I] [J] DP = [I] J-2
3.2、pは[J-2]及びS [I-1]又はpに等しい場合に繰り返される[J-2] == ' ' だからDP [I] [j]は= DP [I-1] [j]を

クラスのソリューション{
 パブリック

    ベクトル <ベクトル< int型 >> DP;
BOOL isMatch(ストリング S、文字列P){
     int型 SN = s.size()。INT PN = p.size()。
    DP =ベクトル<ベクトル< INT >>(SN + 10、ベクトル< INT >(PN + 100 )); 
    DP [ 0 ] [ 0 ] = 1 

    以下のためにint型 i = 0 ; I <= SN; iは++ ){
        INT J = 1 ; <; J ++ = PN J ){
             場合(iは> 0 - && P [J 1 ==] ' ' {)
                DP [I] [J] = DP [I - 1 ] [J - 1 ]。
            } そうなら(I> 0 && P [J - 1 ]!= ' * '   && P [J- 1 ] == S [I- 1 ]){ 
                DP [I] [J] = DP [I - 1 ] [J - 1 ]。
            }
             
            他の 場合(P [J - 1 ] == ' * ' ){
                 // * 
                場合(J> 1 && DP [I] [J - 2 ] == 1 
                    DP [I] [j]は = 1 そう であれば(I> 0 && j>は1 &&(P [J - 2 ] == ' ' || P [J - 2 ] == S [I - 1 ])&& DP [I - 1 ] [J] == 1 
                    DP [I] [J] =1 ; 
            } 
        } 
    } 


    戻りDP [SN] [PN]; 
}    






}; 

著者:defddrの
リンク:HTTPS:// www.acwing.com/solution/acwing/content/3390/ 
出典:AcWing 
著者によって予約の著作権。商業転載は非商用の転載は、ソースを明記してください、権限の作者に連絡してください。

 

おすすめ

転載: www.cnblogs.com/itdef/p/11299204.html