トピック
文字列 s
と文字パターン を指定して、合計 をサポートする 正規表現マッチングp
を実装してください 。'.'
'*'
'.'
任意の 1 文字と一致します'*'
先行する要素の 0 個以上と一致します
いわゆるマッチングは、 文字 列 の一部ではなく、文字列全体をカバーすることです。s
例 1:
**入力: **s = "aa"、p = "a"
**出力: **false
説明: "a" は "aa" の文字列全体と一致することはできません。
例 2:
**入力:* s = "aa", p = "a "
**出力: **true
**説明: **「*」は 0 個以上の前の要素と一致することを意味するため、ここでは前の要素は「あ」です。したがって、文字列「aa」は「a」が 1 回繰り返されたものと考えることができます。
例 3:
**入力: **s = "ab"、p = ". "
**出力: **true
説明: ". " は、0 個以上 ('*') の任意の文字 ('.') と一致することを意味します。
アイデア
まず、この問題が何を意味するのかを明確に考えてください。まず、s と p の各文字が同じかどうかを比較するダブルポインタ比較を考えるのは簡単ですが、ここで問題が発生し、それがこの問題の難しさです。 * この質問を解くための記号 これは DP の実践につながります 0 以上の意味は、p ポインタがこのステップに進むことを意味します s ポインタは 0 に進むことも、それ以上進めなくなるまで進み続けることもできます。それぞれの種類の特別な判断の結果について、境界状況にどう対処するかを明確に考える必要があります。
コード
pLen = len(p)
sLen = len(s)
@cache
def DP(i,j):
if(i==sLen ):
if(j == pLen):
return True
else:
if(j + 1 < pLen and p[j+1] == "*"):
return DP(i,j+2)
else:
return False
if(j == pLen):
return False
if(j + 1 < pLen and p[j+1] == "*"):
ret = DP(i,j+2)
if(p[j] == "." or s[i] == p[j]):
ret = ret or DP(i+1,j)
return ret
else:
if(s[i] == p[j] or p[j] == "."):
return DP(i + 1,j + 1)
else:
return False
return DP(0,0)