MCPcopy
hub / github.com/Jack-Lee-Hiter/AlgorithmsByPython / match

Method match

Target Offer/正则表达式匹配.py:11–52  ·  view source on GitHub ↗
(self, s, pattern)

Source from the content-addressed store, hash-verified

9class 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
55s = Solution()

Callers 4

reTest.pyFile · 0.80

Calls

no outgoing calls

Tested by

no test coverage detected