剣指offer:正規表現マッチング(Python)
4954 ワード
タイトルの説明
問題を解く構想.
考え方は牛客網から来て、モードの中の2番目の文字が
一方、モードの2番目の文字が
改善:モードの2番目の文字が
.
および*
を含む正規表現を一致させるための関数を実装してください.パターン内の文字.
は任意の文字を表し、*
はその前の文字が任意の回数(0回を含む)現れることを表す.本題では、マッチングとは、文字列のすべての文字がモード全体に一致することを意味します.例えば、文字列aaa
は、パターンa.a
およびab*ac*a
と一致するが、aa.a
およびab*a
とは一致しない.問題を解く構想.
考え方は牛客網から来て、モードの中の2番目の文字が
*
ではない時:1.文字列の最初の文字とモードの最初の文字が一致する場合、文字列とモードはいずれも1文字後ろに移動し、残りの文字と一致します.2.文字列の最初の文字とモードの最初の文字が一致しない場合はfalseを直接返します.一方、モードの2番目の文字が
*
である場合、文字列の1番目の文字がモードの1番目の文字と一致しない場合、モードは2文字後ろに移動し、一致を継続します.文字列の最初の文字がパターンの最初の文字と一致する場合、3つの一致方法があります:1.モード後に2文字移動し、x*
に相当して無視される.2.文字列を1文字後ろに移動し、モードを2文字後ろに移動する.3.文字列は1文字後ろに移動し、パターンは変わらない.つまり、*
が複数のビットに一致することができるため、次のビットに一致し続ける.# s, pattern
def match(self, s, pattern):
if s == pattern:
return True
if not pattern:
return False
if len(pattern)>1 and pattern[1] == '*':
if(s and s[0]==pattern[0]) or (s and pattern[0] == '.'):
return self.match(s,pattern[2:]) \
or self.match(s[1:],pattern) \
or self.match(s[1:],pattern[2:])
else:
return self.match(s,pattern[2:])
elif s and (s[0] == pattern[0] or pattern[0]=='.'):
return self.match(s[1:],pattern[1:])
return False
改善:モードの2番目の文字が
*
である場合:1、モードの後に2文字移動し、x*
に相当して無視される.2、文字列は1文字後ろに移動し、モードは2文字後ろに移動する.3、文字列は1文字後ろに移動し、パターンは変わらない.つまり、*
が複数のビットに一致できるため、次のビットに一致し続ける.ケース3はケース1とケース2に含まれる.def match(self, s, pattern):
if s == pattern:
return True
if len(pattern)>1 and pattern[1] == '*':
if s and (s[0]==pattern[0] or pattern[0] == '.'):
return self.match(s,pattern[2:]) or self.match(s[1:],pattern)
else:
return self.match(s,pattern[2:])
elif s and pattern and (s[0] == pattern[0] or pattern[0]=='.'):
return self.match(s[1:],pattern[1:])
return False