문제
- 만들어질 수 있는 가장 긴 대칭 부분수열의 길이 구하기
- 문자가 몇개 빠질 수도 있음
- 그래도 순서는 고정
구현
- s[start] == s[end] 이면 (start+1 ~ end-1) 에서의 Longest Palindromic Subsequence 길이 + 2
- s[start] != s[end] 이면 Max(LPS(start ~ end-1),LPS(start+1 ~ end))
- 중복제거를 위해 map에 길이 저장
시간 복잡도
- O(N) ~ O(2^N) - 중복제거 ?
코드
var seqMap map[string]int func longestPalindromeSubseq(s string) int { seqMap = make(map[string]int) bytes := []byte(s) return getLength(0,len(s)-1,&bytes) } func getLength(s int, e int, seq *[]byte) int { if s>e { return 0 } if s==e { return 1 } str := string((*seq)[s:e+1]) val, ok := seqMap[str] if ok { return val } if (*seq)[s] == (*seq)[e] { seqMap[str] = getLength(s+1, e-1, seq) + 2 } else { left := getLength(s, e-1, seq) right := getLength(s+1, e, seq) if left>right { seqMap[str] = left } else { seqMap[str] = right } } return seqMap[str] }
'알고리즘' 카테고리의 다른 글
[LeetCode] 409. Longest Palindrome (golang) (0) | 2021.06.12 |
---|---|
[LeetCode] 104. Maximum Depth of Binary Tree (golang) (0) | 2021.06.07 |
[LeetCode] 66. Plus One (golang) (0) | 2021.06.02 |
[LeetCode] 205. Isomorphic Strings (golang) (0) | 2021.06.02 |
[LeetCode] 572. Subtree of Another Tree (golang) (0) | 2021.06.01 |
댓글