Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
문제
https://leetcode.com/problems/longest-palindromic-substring/description/
풀이
난이도: Medium
다이나믹 프로그래밍으로 해결 가능한 유명한 문제.
dp[start][end] 는 문자열의 start에서 end 까지의 최대 팰린드롬 길이를 의미한다.
팰린드롬이 되려면 일단, start와 end의 문자가 같아야한다.
따라서 start와 end의 문자가 같은 경우만 팰린드롬 여부를 확인하면 된다.
여기서 dp에는 가장 긴 팰린드롬 길이가 저장되어 있으므로,
dp[start][end] = dp[start +1][end -1] + 2가 된다.
이러한 알고리즘은 start와 end 모두 확인해야 하므로 O(N^2)의 시간 복잡도와 공간 복잡도가 소요된다.
다이나믹으로 해결하는 것은 너무 많이 봐왔으니 다른 해결법도 확인해보자.
해결법의 Approach 4: Expand Around Center 를 확인해보자.
팰린드롬은 가운데의 문자를 기준으로 대칭이다.
가운대 문자는 단 한개 ex) "aba" 에서의 "b", "abbba" 에서의 "b"
혹은 두개가 될 수 있다. ex) "abba" 에서의 "bb", "abbbba"에서의 "bb"
따라서 문자열을 순서대로 순회하면서 두가지 경우에서, 펠린드롬 여부를 확인하면서 양쪽으로 확장해 나간다.
이러한 알고리즘은 O(N^2)의 시간 복잡도가 소모되지만, 공간 복잡도는 O(1)이다.
단, 다이나믹은 이미 계산한 값을 바로 이용하므로 공간 복잡도는 높더라도 좀더 빠를 수도 있다고 생각한다.
코드
'알고리즘 공부 > LeetCode' 카테고리의 다른 글
[LeetCode] 102. Binary Tree Level Order Traversal (C++) (0) | 2022.12.30 |
---|---|
[LeetCode] 124. Binary Tree Maximum Path Sum (C++) (0) | 2022.12.28 |
[LeetCode] 49. Group Anagrams (C++) (0) | 2022.12.26 |
[LeetCode] 76. Minimum Window Substring (C++) (0) | 2022.12.10 |
[LeetCode] 424. Longest Repeating Character Replacement (c++, 슬라이딩 윈도우) (2) | 2022.09.03 |