[LeetCode] 10. 정규 표현 식 일치 문제 풀이 보고서 (파 이 썬)
이 문 제 는 간단 한 정규 표현 식 을 실현 하 는 것 입 니 다. '와' * '를 실현 해 야 합 니 다. 그 중에서' * '는 모든 문 자 를 표시 할 수 있 습 니 다.' * '는 앞의 문자 가 0 또는 임 의 로 나타 나 는 것 을 표시 합 니 다.먼저 욕심 을 부 리 는 방법 을 생각해 서 해결 해 야 하 는데 '.................................................................다른 방법 을 고려 하면 그 중에서 재 귀 는 바로 하나의 것 으로 문 제 를 하위 문제 로 나 누 어 고려 하 는 것 이다.일반적인 상황 에서 재 귀 는 동태 계획 으로 전환 할 수 있 고 동태 계획 은 공간 으로 시간 을 바 꿀 수 있다. 재 귀 시간 이 길 면 시간 제한 을 초과 할 수 있 기 때문에 우 리 는 동태 계획 으로 해결 하 는 것 도 고려 해 야 한다.
재 귀적 으로 문 제 를 해결 하 다.
생각:
1. p 가 비어 있 으 면 s 도 비어 있어 야 일치 합 니 다.
2. p 와 s 의 첫 번 째 문 자 를 비교 하고 표 시 를 합 니 다.
3. p [1] = '*' 는 두 가지 상황 으로 나 뉘 는데 '*' 를 앞의 문자 로 0 번 나타 나 면 p 두 글자 (하 나 는 '*') 를 건 너 뛰 고 재 귀적 으로 s 와 p [2:] 를 비교 합 니 다.'*' 를 이전 문자 로 한 번 나타 나 는 것 을 고려 하면 p 는 움 직 이지 않 지만 s 문 자 를 건 너 뛰 면 재 귀적 으로 s [1:] 와 p 를 비교 합 니 다.
4. 만약 p [1]! = '*'직접 재 귀 비교 s [1:] 와 p [1:].
재 귀적 코드 설명:
1. p 가 비어 있 으 면 s 도 비어 있어 야 일치 합 니 다.
if len(p) == 0: return len(s) == 0
2. s 와 p 의 첫 번 째 문자 가 같 는 지 비교 하고 표시 하 는 것 으로 간단하게 이해 할 수 있 습 니 다.
flag = len(s) != 0 and p[0] in {s[0], '.'}
3. p [1] = '*' 는 두 가지 상황 으로 나 뉘 는데 '*' 를 앞의 문자 로 0 번 나타 나 면 p 두 글자 (하 나 는 '*') 를 건 너 뛰 고 재 귀적 으로 s 와 p [2:] 를 비교 합 니 다.'*' 를 이전 문자 로 한 번 나타 나 는 것 을 고려 하면 p 는 움 직 이지 않 지만 s 문 자 를 건 너 뜁 니 다. 즉, 재 귀 비교 s [1:] 는 p, flag and 와 이전 문자 가 같 음 을 나타 냅 니 다.
if len(p) >=2 and p[1] == '*':
return (flag and self.isMatch(s[1:], p) or (self.isMatch(s, p[2:])))
4. 만약 p [1]! = '*'직접 재 귀적 비교 s [1:] 는 p [1:], flag and 와 이전 문자 가 같 음 을 나타 낸다.
else:
return flag and self.isMatch(s[1:], p[1:])
테스트 코드:
class Solution:
def isMatch(self, s, p):
if len(p) == 0: return len(s) == 0
flag = len(s) != 0 and p[0] in {s[0], '.'}
if len(p) >=2 and p[1] == '*':
return (flag and self.isMatch(s[1:], p) or (self.isMatch(s, p[2:])))
else:
return flag and self.isMatch(s[1:], p[1:])
print(Solution().isMatch('aab','c*a*b'))#
결과:
제출 표시: 런 타임: 1612 ms, Your runtime beats 7.13% of python 3 submissions. 운행 시간 이 비교적 길 면 대부분 사람들 이 재 귀적 으로 해결 하 는 것 이 아 닐 것 입 니 다. 동적 계획 을 사용 하여 공간 으로 시간 을 바 꾸 어 보 겠 습 니 다.
동적 계획 해결 문제:
동적 계획 코드 설명: 코드 해석 이 복잡 하기 때문에 저 는 코드 에 주석 을 직접 넣 었 습 니 다. 만약 에 제 가 참고 한 블 로 그 를 보 거나 디 버 깅 을 할 수 있 습 니 다.
class Solution:
def isMatch(self, s, p):
# False ,dp[i][j] s[0->i] p[0->j] 。
dp=[[False for i in range(len(p)+1)] for j in range(len(s)+1)]
#s p
dp[0][0]=True
# s * , *
for i in range(1,len(p)+1):
dp[0][i] = p[i-1] == '*' and dp[0][i-2] and i>1
for i in range(1,len(s)+1):
for j in range(1,len(p)+1):
#p '*' , * * s * s
if p[j-1]=='*':
dp[i][j]=dp[i][j-2] or (dp[i-1][j] and (s[i-1]==p[j-2] or p[j-2]=='.'))
# * and
else:
dp[i][j] = dp[i-1][j-1] and (p[j-1] == '.' or p[j-1] == s[i-1])
# s[0->len(s)] p[0->len(p)]
return dp[len(s)][len(p)]
print(Solution().isMatch("mississippi", ".*mis*is*p*."))#
결과: 제출 표시: Runtime: 64ms, Your runtime beats 74.03% of python 3 submissions. 실행 시간 은 가능 합 니 다. 동적 계획 으로 문 제 를 해결 하 였 습 니 다.
참고 블 로그 1, 참고 블 로그 2
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.