링크
문자열이 정규식에 부합하는지 찾는 문제
def isMatch(self, text, pattern):
if not pattern:
return not text
first_match = bool(text) and pattern[0] in {text[0], '.'}
if len(pattern) >= 2 and pattern[1] == '*':
return (self.isMatch(self, text, pattern[2:]) or first_match and self.isMatch(self, text[1:], pattern))
else:
return first_match and self.isMatch(self, text[1:], pattern[1:])
// p ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
s [[1, 0, 1, 0, 1, 0, 1],
| [0, 0, 0, 0, 0, 0, 0],
| [0, 0, 0, 0, 0, 0, 0]]
pattern 의 글자가 s 와 같거나 '.' 문자일 경우, dp[i-1][j-1] 와 같음
patterh 의 글자가 * 라면
해당 문자가 0번 나타남 = dp[i][j - 2] (해당 정규식의 문자 제외)
해당 문자가 1번 이상 나타남 = *앞의 문자와 s 가 같거나 . 이고 이전 문자까지 성립
def isMatch(self, s: str, p: str) -> bool:
s, p = ' ' + s, ' ' + p
lenS, lenP = len(s), len(p)
dp = [[0] * (lenP) for i in range(lenS)]
dp[0][0] = 1
for j in range(1, lenP):
if p[j] == '*':
dp[0][j] = dp[0][j - 2]
for i in range(1, lenS):
for j in range(1, lenP):
if p[j] in {s[i], '.'}:
dp[i][j] = dp[i - 1][j - 1]
elif p[j] == "*":
dp[i][j] = dp[i][j - 2] or int(dp[i - 1][j] and p[j - 1] in {s[i], '.'})
return bool(dp[-1][-1])