剣指offer:正規表現マッチング(Python)


タイトルの説明.および*を含む正規表現を一致させるための関数を実装してください.パターン内の文字.は任意の文字を表し、*はその前の文字が任意の回数(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