サポート「」と「*」正規表現のマッチングでを実装するためにあなたを招待し、あなたの文字列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 * IS * P *。"
出力:偽
出典:滞在ボタン(LeetCode)
この問題は少し難しいが、誰か他の人の答えを盗みます
クラスのソリューション{
/ **
* @param文字列$ sの
* @param文字列$ P
* @returnブール
* /
関数isMatch($ S、$ P){
(空($ p)は)空($ S)を返す場合。
!$ first_match =空($ S)&&($ P [0] == $ S [0] || $ pを[0] == '');
IF(strlenを($ P)> = 2 && $ P [1] == '*'){
返します$ this-> isMatch($ S、SUBSTR($ P、2))|| ($ first_match &&の$ this - > isMatch(SUBSTR($ s、1)、$ P))。
}そうしないと{
返す$ first_match &&ます$ this-> isMatch(SUBSTR($ S、1)、SUBSTR($ P、1));
}
}
}
クラスのソリューション{
/ **
* @param文字列$ sの
* @param文字列$ P
* @returnブール
* /
関数isMatch($ S、$ P){
$ M = STRLEN($ S)。
$ N = STRLEN($のP)。
(array_fill 0、$ M + 1、(0、$ N + 1、偽))= array_fill F $。
$ F [0] [0] = TRUE;
{($ K ++; $ K <= $ N $ K = 2)のために
$ F [0] [$ K] = [0] [$ K - 2] F $ && $ P [$ K - 1] == '*'。
}
用($ i = 1; $ I <= $ M、$ I ++){
{($のJ ++; $ J <= $ N $ J = 1)のために
IF($ S [$ I - 1] == $ P [$ J - 1] || $ P [$ J - 1] '' ==){
$ F [$ i]が[$ J = $ F [$ I - 1] [$ J - 1]。
}
もし($ P [$ J - 1] == '*'){
$ F [$ i]が[$ J] = [$ i]と[$ J - 2] F $ ||
$ F [$ I - 1] [$ J] &&($ S [$ I - 1] == $ P [$ J - 2] || $ P [$ J - 2] == '');
}
}
}
[$ M] [$ n]はF $を返します。
}
}