2024년 4월 7일 (일)
Leetcode daily problem
https://leetcode.com/problems/valid-parenthesis-string/?envType=daily-question&envId=2024-04-07
'(', ')', '*' 3개의 문자로만 이루어진 문자열이 유효한 괄호 형식을 띄고 있으면 True, 아니면 False를 반환한다.
- '('는 ')'보다 왼쪽에 있어야함
- ')'는 '('보다 오른쪽에 있어야함
- '*'는 '(' 와 ')' 가운데, 사이에 있어야 함
'*'는 와일드 카드 이다.
two pointer
해당 방법은 다이나믹 프로그래밍, 스택, 투 포인터등 여러가지 방법으로 해결할 수 있다.
투 포인터로 해결하는 방법은
여는 괄호와 닫는 괄호를 초기화해서 해당 괄호의 수를 업데이트해가면서 추적하는 것이다. 입력 문자열 s의 길이를 계산하여 길이변수에 할당한다.
단일 루프를 사용하여 문자열을 양쪽 끝에서 동시에 탐색한다.
0부터 길이(포함)까지 인덱스 i를 반복하는데,
(
또는 *
인 경우 openCount를 증가시킨다.)
또는 *
인 경우 closeCount를 증가킨다.class Solution:
def checkValidString(self, s: str) -> bool:
Open, Close = 0, 0
length = len(s)-1
for i in range(length+1):
if s[i] == '(' or s[i] == '*':
Open +=1
else:
Open -=1
if s[length-i] == ')' or s[length-i] == '*':
Close +=1
else:
Close -=1
if Open < 0 or Close <0:
return False
return True
시간 복잡도
입력 문자열의을 왼쪽부터 오른쪽으로 한 번씩 스킨해므로, 입력 문자열의 길이에 비례하는 선형 시간이 소요된다. 해당 코드의 시간 복잡도는 O(n)이다.
공간 복잡도
주어진 문자열 외에 상수 개수의 변수만 사용하므로 해당 코드의 공간 복잡도는 O(n)이다.