テン正規表現のマッチングアルゴリズム

サポート「」と「*」正規表現のマッチングでを実装するためにあなたを招待し、あなたの文字列sと法pを与えます。

「」は任意の単一文字一致
『*』マッチがゼロまたはそれ以上の前述の要素のことを

、いわゆるマッチングは、文字列の文字列の全体ではなく一部を覆うようにします。

説明:

    Sは空であり、そして小文字のみからAZ。
    pは*空であるとAZ、および文字。とから、小文字のみが含まれていてもよいです。

例1:

入力:
S = "AA"
P = "A"
出力:偽
の解釈: ""文字列全体"AA"に一致することはできません。

実施例2:

入力:
S =「AA」
P =「A *」
出力:真の
説明:「*」マッチ「」は複数の要素は、この要素の前にあること、ゼロまたは上記の代表です。したがって、文字列は「AA」「」回繰り返されるとみなすことができます。

例3:

入力:
S = "AB&"
Pは= "*。"
出力:真の
説明: "*"は任意の文字の意味はゼロまたはそれ以上のマッチを( '*')(」。「)。

実施例4:

入力:
S = "AAB"
P = "C * A * B"
出力:真
説明:「*」手段はゼロか「C」が0であるところより、「」一度繰り返されているので。だから、文字列「AAB」を一致させることができます。

例5:

入力:
S = "ミシシッピ"
P = "MIS * * P *である。"
出力:偽

出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/regular-expression-matching
源泉徴収ネットワークからのすべての著作権。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。

この質問を取得し、この難しさは、ビットの周りを感じ、困難である、と思いました。一瞬の分析は、気持ちが最初からストリングの照合を開始することができ、対処する唯一のものは、* pとすると、アイデアが間違っていること、マッチ、sおよびpは、次にスキップされている場合には、一致していないです。

現在の一致した場合、*現在のような次のを追加する必要があるので、次はまた、その後、*適したpです。私はあなたが一致する場所に最終的に伝えることができないので、しかし、これは*、こうしたS = SSSA P = S *のSSAとして、問題が発生しています。

だから私はそれがマッチングを逆にすることができますかどうかと思いますか?モーメントの結果は、あるいは、そのようなS = SSSA P = SSS *として、最後の試合でどのくらいを区別するために、*、またはない方法で問題を解決しませんでした。

我々は、すべてのこれらの理由は、フロントに起因しているとリア*が同じ文字列に浮上していることがわかった。この場合、それは最初のp S * SSAを変えることができるものではありませんかSSS * S *となっている、同じ合併であります。

書き込みテストコード、問題の提出があり、[「」任意の1文字に一致]、分析した後、見つかった突然、最も影響の分析があることを見出し、ほとんどがパフォーマンスに影響を与え、そして私のこの方法は効果的でないルールになっています組み合わせ[。「*」は、ゼロ個以上の(「*」)任意の文字を(「」)マッチングを表す]、私はどこ一致させたい最後に戻って上記の質問につながるのだろうか?例:

S = aaabcd P = A。* ABCD

それを行う方法を、それだけで、このようなAウェイ網羅でいるようです。上記の例では、マッチングを取る。必要性が判断された場合*。*は任意の文字、文字の一致と一致していない、同じ文字が、これは、一致するルールがあり、マッチングの複数が成功し、成功しています。

私は解決策を持って、問題の解決策を参照して、解決策は、有限状態マシンを持って、私はよく理解、非常に良い感じ、その後、画面の指示に従って、いわゆるブルートフォース方法を書きました。Pは、有限状態機械の同様のパターンの文字のシーケンスを生成するためのマッチング規則である現在の一致文字か否かを各ノードの定義及び(一致0または無限回)繰り返すことができます。

現在のノードが反復可能であるならば、次のノードにスキップし、この分岐戻りfalseの場合、それを、現在のノードが再現可能でない場合は次のノードにマッチスキップが直接リターン偽と一致しない場合は、直接決定このサイクル一度現在のノードと一致します。

構造体CHECKNODE 
{ 
    // 現在の文字
    チャーC;
     // 、0-n回サイクル一致
    BOOL REP;
     // 次の文字ノード 
    CHECKNODE * pNext; 
    CHECKNODE()
    { 
        C = 0 ; 
        REP = falseにする
        pNext = nullptr A; 
    } 
}; 
BOOLの(checkm CONST  文字列&S、INT SINDEX、CHECKNODE * pNOW)
{ 
    IF(SINDEX == s.size())
    { 
        IF(pnow == nullptr)
        { 
            戻り 
        } 
        
        { 
            場合(pnow-> REP)
            { 
                戻り checkm(S、SINDEX、pnow-> pnext)。
            } 
            
            { 
                戻り 
            } 
        } 
    } 
    もし(SINDEX <s.size()&& pnow == nullptr)
    { 
        戻り 
    } 
    であれば(pnow-> REP)
    { 
        場合(!checkm(S、SINDEX、pnow->  pnext))
        {
            もし(pnow-> C == S [SINDEX] || pnow-> C == ' ' 
            { 戻り checkm(S、SINDEX + 1 、pnow)。
            } 
            { 戻り
            } 
        } 
        { 戻り
        } 
    } 
    { 場合(pnow-> C == S [SINDEX] || pnow-> C == ' ' 
        { 戻り checkm(S、SINDEX + 1、pnow->
                
            
                 
            
        
             
    
        
             pnext)。
        } 
        
        { 
            戻り 
        } 
    } 
    を返す 
} 
BOOL isMatch(ストリング S、文字列P){ 
    CHECKNODE * pheard = nullptr。
    CHECKNODE * pnow = nullptr;
    (オート&ITER:P)
    { 
        場合(pheard == nullptr)
        { 
            pheard = 新しいCHECKNODE()。
            pnow = pheard。
            pnow - > C = ITER。
        }
        他に
        { 
            場合(!ITER = ' * ' 
            { 
                pnow - > pnext = 新しいCHECKNODE(); 
                pnow = pnow-> pnext。
                pnow - > C = ITER。
            } 
            
            { 
                pnow - >担当者= 
            } 
        } 
    } 
    戻り checkm(S、0 、pheard)。
}

 

おすすめ

転載: www.cnblogs.com/studywithallofyou/p/12084395.html