(self, s, pattern)
| 9 | class Solution: |
| 10 | # s, pattern都是字符串 |
| 11 | def match(self, s, pattern): |
| 12 | if not s or not pattern: |
| 13 | return False |
| 14 | # 如果s和pattern匹配, 直接True |
| 15 | if s == pattern: |
| 16 | return True |
| 17 | # 如果pattern为'', 因为s和pattern不相等, 直接False |
| 18 | elif pattern == '': |
| 19 | return False |
| 20 | # 当s为'', 如果pattern为'.', 则返回True |
| 21 | # 当s为'', 如果pattern长度为1且不为'.', 或者pattern第二个字符不是*, 则pattern不可能为空, 返回False |
| 22 | # 若pattern长度不为1, 且第二个字符为*, pattern还有空的可能, 从第三个字符开始迭代 |
| 23 | elif s == '': |
| 24 | if pattern == ".": |
| 25 | return True |
| 26 | elif len(pattern) == 1 or pattern[1] != '*': |
| 27 | return False |
| 28 | else: |
| 29 | return self.match(s, pattern[2:]) |
| 30 | # 如果pattern长度不小于二, 而且pattern的第二个字符不是*的情况下 |
| 31 | # 当 pattern[0] 不等于s[0], 且不为 . 的时候, s和pattern必不相等 |
| 32 | # 否则, s 和 pattern 都右移一位, 继续比较 |
| 33 | if len(pattern) >= 2 and pattern[1] != '*': |
| 34 | if s[0] != pattern[0] and pattern[0] != '.': |
| 35 | return False |
| 36 | else: |
| 37 | return self.match(s[1:], pattern[1:]) |
| 38 | # 如果pattern长度不小于2, 且pattern第二个字符为*的情况下 |
| 39 | # 如果s[0]不等于pattern[0], 且pattern[0]不为 . , 那么第一位比较不成功, pattern必须后移两位继续比较后面是否能和s第一位匹配 |
| 40 | # 如果s[0]等于pattern[0], 或者pattern[0]为 . , 第一位匹配, 那么会有 |
| 41 | # 1. aaa 和 a*a 这种情况, 星号代表了多个a, 因此s需要不断右移一位继续比较 |
| 42 | # 2. a 和 a*a 中这情况, 这时候星号代表0个a, 因此s不需要右移, pattern需要右移两位 |
| 43 | # 3. abc 和 a*bc 这种情况, 星号代表了1个a, s右移一位, pattern右移两位继续比较 |
| 44 | elif len(pattern) >= 2 and pattern[1] == '*': |
| 45 | if s[0] != pattern[0] and pattern[0] != '.': |
| 46 | return self.match(s, pattern[2:]) |
| 47 | else: |
| 48 | return self.match(s[1:], pattern) or self.match(s, pattern[2:]) or self.match(s[1:], pattern[2:]) |
| 49 | # 除去上述pattern不小于2情况, 只剩下pattern等于1的情况, 因此如果pattern为".", 而且s长度为1, 返回True |
| 50 | elif pattern == '.' and len(s) == 1: |
| 51 | return True |
| 52 | return False |
| 53 | |
| 54 | |
| 55 | s = Solution() |
no outgoing calls
no test coverage detected