2024. 7. 28. 23:11ㆍAlgorithm
1. problem :
https://leetcode.com/problems/is-subsequence/description/?envType=study-plan-v2&envId=leetcode-75
2. solution 1 :
class Solution:
def isSubsequence(self, s: str, t: str) -> bool:
i,j = 0,0
s_len,t_len = len(s) , len(t)
while i < s_len and j < t_len:
if s[i] == t[j]:
i += 1
j += 1
if i == s_len:
return True
return False
이 solution은 chat gpt 4o가 짜준 코드이다. two-pointer 접근법이다. i는 s를 순회하고, j는 t를 순회한다. s [i]와 s [j]가 같다면, i +=1을 하고, j +=1을 한다. 만약에 다르다면 s의 i는 건드리지 않고, t의 j만 1 증가한다. 꼭 기억하자.
3. solution 2 :
def is_subsequence(a, b):
m, n = len(a), len(b)
dp = [[False] * (n + 1) for _ in range(m + 1)]
for j in range(n + 1):
dp[0][j] = True
for i in range(1, m + 1):
for j in range(1, n + 1):
if a[i - 1] == b[j - 1]:
dp[i][j] = dp[i - 1][j - 1]
else:
dp[i][j] = dp[i][j - 1]
return dp[m][n]
# 예제 문자열
a = "abc"
b = "ahbgdc"
# 결과를 확인합니다.
if is_subsequence(a, b):
print(f'"{a}"는 "{b}"의 부분 문자열입니다.')
else:
print(f'"{a}"는 "{b}"에 포함되지 않습니다.')
dp를 이용한 풀이법이다. 복잡하다.
일단 memoization을 할 dp_table부터 만들자.
"" a h b g d c
"" T T T T T T T
a F F F F F F F
b F F F F F F F
c F F F F F F F
||||
||||
\/\/
"" a h b g d c
"" T T T T T T T
a F T T T T T T
b F F F T T T T
c F F F F F F T
결과적으로 , a [i-1]과 b [j-1]이 같다면, 나는 그전행의 전열을 참조할 것이다. 그 말인즉슨, a [:i-2] 원소는 b [:j-2]의 substring이 참인지 거짓인지를 담고 있는 결과다. 따라서, True라면 a [:i-1]과 b [:j-1]도 true가 된다.
예를 들어, [1,2,3]이 있다. 이 리스트가 [1,2,5,4,3]의 sublist인지 확인해 보자. [1,2]는 최소한 [1,2]부터 시작해서 [1,2,5], [1,2,5,4], [1,2,5,4,3]이면 모두 만족한다. 그러므로 , [1,2,3]이 만족하기 위해서는 [1,2,5,4]가 [1,2,]를 만족해야 한다. ([1,2,3]의 3은 [1,2,5,4,3]의 마지막원소이기 때문이다.)
내가 아직 제대로 이해하지 못해서 쉽게 설명을 못했다. dp에 대한 숙련도가 증가하면 더 자세히 설명하겠다.
'Algorithm' 카테고리의 다른 글
[Leetcode]643. Maximum Average Subarray I (0) | 2024.07.30 |
---|---|
[Leetcode]792. Number of Matching Subsequences(x) (0) | 2024.07.29 |
[BOJ]10808(O) (0) | 2024.07.28 |
[Leetcode]283. Move Zeroes(n^2말고 다른풀이로 풀어볼것) (0) | 2024.07.28 |
[Leetcode]443. String Compression(x) (0) | 2024.07.28 |