10.正規表現のマッチング[H]は、正規表現にマッチします

タイトル

入力文字列(S)及びパターン(P)所与のサポートと一致する正規表現を実装「」そして、「」。
> '' 任意の1文字に一致します。
」先行する要素のゼロまたはそれ以上一致します。

マッチングは、入力文字列全体(部分的ではない)をカバーすべきです。
注意:

sが空であるとAZ小文字のみが含まれていますができます。
pは空であるとだけ小文字aからz、および文字が含まれて可能性があります。または*。

例1:
入力:S =「AA」P =「」
出力:偽の
説明:「」文字列全体「」一致しない
例2:
入力:S =「AA」P =「*」
出力:真の
説明を:「」 『A』、precedeng要素のゼロまたはそれ以上を意味します。したがって、「」一回繰り返すことで、それが「A」になります。
例3:
入力: "*" S = "AB" P =
出力:真の
説明: "
""任意の文字のゼロ個以上(*)を(。)"を意味します。


Pythonの知識

  • 同じ値を初期化(一次元配列)
#方法一:list1 = [a a a ]
list1 = [ a for i in range(3)]
#方法二:
list1 = [a] * 3
  • 二次元配列の初期化
    • 各固定アレイの4 * 3 ** 0を初期化します
    list2 = [ [0 for i in range(3)] for j in range(4)]

    考え

    ダイナミックプログラミング

    解決すべき問題は、最初の質問を祈る、いくつかの非相互に独立したサブ問題に分割し、元の質問をされています。(典型的には、2次元アレイ状に異なる段階で異なる状態に格納する必要があります)

:ステップ1の構造的特徴は、最適解特徴付ける
(\ [J] DP [I])\を表す\(S [0、\ cdots 、I-1] \) と\(P [0、\ cdots 、J-を1] \)と一致
ステップ2:再帰的に定義された最適値溶液
1 \(P [J-1] == S [I-1] \)状態保存、\(DP [I] [J] = DP [1-I] [J-1] \)
2 \(P [-J 1] == \) ..保存の任意の単一文字一致、状態、\(DP [I] [J] DP = [ 1-i]は[J-1] \)
3. P-$ [J-1] == $は**唯一できるX*一致させるために形成するが、理由の*いくつかの文字が不確実な一致するものを、この時点で2例があります。

  • \(P [J-2]!= S [-I 1] \)、この時間\(S [0、\ cdots 、I-1] \) と\(P [0、\ cdots 、J-3] \)一致、すなわち\(DP [I] [jが 】DPを= [I]、[J-2] \)
  • \(P [J-2] == S [I-1] \) またはP $ [J-2] == \( `.`、今回は3つのケースに分けなければならない:*` `ゼロ文字として、\) DP [I] [J] DP = [I]、[J-2] $
    *文字として、\(DP [I] [J] DP = [I]、[J-1] \)
    *複数の文字として、\ (DP [I] [J] DP = [1-I] [J] \)

STEP3。算出された最適値
の状態遷移表に従って、および漸化式演算DP [I] [J]


C ++

bool isMatch(string s, string p){
  int m = s.length(), n = p.length();
  bool dp[m+1][n+1];
  dp[0][0] = true; //空字符与空字符相匹配
  //初始化
  for(int i = 1; i <=m; i++)
    dp[i][0] = false;
  for(int i = 1; i <=n; i++)
    dp[0][i] = i > 1 && p[i-1] == '*' && dp[0][i-2];
  for(int i = 1; i<=m; i++){
    for(int j = 1; j<=n; j++){
      if(p[j-1] == '*'){
        dp[i][j] = dp[i][j-2] || (s[i-1] == p[j-2] || p[j-2] == '.') && dp[i-1][j];
      }
      else{
        dp[i][j] = (p[j-1] == '.' || s[i-1] == p[j-1]) && dp[i-1][j-1]
      }
    }
  }
}

パイソン

def isMatch(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: bool
        """
        len_s = len(s)
        len_p = len(p)
        dp = [[False for i in range(len_p+1)]for j in range(len_s+1)]
        dp[0][0] = True
        for i in range(1, len_p + 1):
            dp [0][i] = i>1 and dp[0][i - 2] and p[i-1] == '*'
        for i in range (1, len_s + 1 ):
            for j in range(1, len_p + 1):
                if p[j - 1] == '*':
                    #状态保留
                    dp[i][j] = dp[i][j -2] or (s[i-1] == p[j-2] or p[j-2] == '.') and dp[i-1][j]
                else:
                    dp[i][j] = (p[j-1] == '.' or s[i-1] == p[j-1]) and dp[i-1][j-1]
        return dp[len_s][len_p]

おすすめ

転載: www.cnblogs.com/Jessey-Ge/p/10993447.html