728x90
반응형
1. 문제
Given an input string s and a pattern p, implement regular expression matching with support for '.' and '*' where:
'.' Matches any single character.
'*' Matches zero or more of the preceding element.
The matching should cover the entire input string (not partial).
Example 1:
Input: s = "aa", p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".
Example 2:
Input: s = "aa", p = "a*"
Output: true
Explanation: '*' means zero or more of the preceding element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".
Example 3:
Input: s = "ab", p = ".*"
Output: true
Explanation: ".*" means "zero or more (*) of any character (.)".
Constraints:
1 <= s.length <= 20
1 <= p.length <= 20
s contains only lowercase English letters.
p contains only lowercase English letters, '.', and '*'.
It is guaranteed for each appearance of the character '*', there will be a previous valid character to match.
2. 배운점
3. 내 풀이
기본 Run을 통과하고 나머지 case들을 검토하다가 문제를 잘못 파악하고 있었다는 것을 알게 됐다. 문제가 어려워서 결국 풀이법을 보게됐다. 다음에 다시 볼 때는 학습한 내용을 기억하고 있기를!
궁금했던 점 기록
- 2개의 문자열 또는 리스트의 요소를 하나씩 비교해야할 때 for문 말고 적절한 방법이 있을까? 그리고 2개 중 어떤게 긴지 판단하는데 좋은 방법이 있을까? 실무에서도 많이 쓰일 수 있을 것 같다.
- 아래 case 주석에 적어놓은 것처럼 여러가지 case가 복잡하게 존재할 때 이것을 과연 일일이 if문으로 처리해야할까? 엄청나게 복잡한 현실 문제면 모르겠으나 뭔가 방법이 있기 때문에 문제로 출제된 것이 아닐까 의심해봐야할 것 같다. 그런다고 경험해보지 못한 해법이 금방 튀어나올 것 같지는 않지만...
class Solution:
def isMatch(self, s: str, p: str) -> bool:
# p, s 길이 긴걸로 돌면서 분기
if len(s) >= len(p):
for s_idx, s_ch in enumerate(s):
for p_idx, p_ch in enumerate(p):
if s_ch == p_ch:
if p[p_idx + 1] == '*':
if s_ch != p_ch:
continue
# case s= aab, p=c*a*b
# case s= a**b, p=c*a*b
# 1. s == p
# 2. p == .
# 3. s != p / s != p and next_p == *
4. 해법
- 힌트
- Dynamic programming, recursion
- 링크
- 풀이 보기
더보기
class Solution:
def isMatch(self, s: str, p: str) -> bool:
memo = {}
def dp(i: int, j: int) -> bool:
if (i, j) in memo:
return memo[(i, j)]
if j == len(p):
return i == len(s)
first_match = i < len(s) and (p[j] == s[i] or p[j] == '.')
if j + 1 < len(p) and p[j+1] == '*':
ans = dp(i, j+2) or (first_match and dp(i+1, j))
else:
ans = first_match and dp(i+1, j+1)
memo[(i, j)] = ans
return ans
return dp(0, 0)
참조
728x90
반응형
'Computer Science > Algorithm' 카테고리의 다른 글
git으로 통합함 (0) | 2023.10.04 |
---|---|
[Leetcode] [작성중] 11. Container With Most Water (0) | 2023.06.30 |
[Leetcode] 9. Palindrome Number (0) | 2023.06.07 |
[Leetcode] 8. String to Integer (atoi) (0) | 2023.06.03 |
[LeetCode] 7. Reverse Integer (0) | 2023.06.02 |