티스토리 뷰
728x90
반응형
문제 요약
- 알고리즘 분류: 문자열, 백트레킹
- 난이도: Medium
- 문제내용:
- 문자열 S가 주어지면 Palindrome 부분 문자열 목록들을 출력하라.
- 사이트 주소: https://leetcode.com/problems/palindrome-partitioning/description/
문제풀이
이번 문제에는 백트레킹 관련 문제이다. 백트레킹 관련 자세한 내용은 아래 글에서 참고 하면된다.
https://jih3508.tistory.com/84
문제 접근방법
Palindrome은 문자열뒤집었을때 같은 문자열을 말한다. 예를 들어 '기러기', '토마토' 같은 문자열이다. 이번 문제에서는 부분 문자열 슬라이싱하고 문자열 뒤집기만 하면 문제푸는데에 크게 지장이 없다. 구현 순서는 아래와 같이 하면 된다.
- 파라미터는 정수 N과 리스트로 한다. 그리고 N은 0부터 시작한다.
- N부터 해서 문자열 길이까지 반목문 i로 돌린다.
- N부터 i까지 문자열을 추출하고 거꾸로 뒤집어서 같으면 리스트에 추가하고 i+1로 그 다음을 진행한다.
- N이 문자열 길이가 같으면 목록을 추가한다.
Code
Python
class Solution:
def partition(self, s: str) :
self.s = s
self.length = len(s)
self.result = []
self.backtracking(0)
return self.result
def backtracking(self, n , p = []):
if(n == self.length):
self.result.append(p)
for i in range(n + 1, self.length + 1):
string = self.s[n : i]
# 문자열 같으면 리스트에 저장 하고 그 다음을 진행한다.
if string == string[::-1]:
self.backtracking(i, p + [string])
solution = Solution()
s = "aab"
print(solution.partition(s))
s = "a"
print(solution.partition(s))
- string[::-1]: [::-1]은 리스트또는 문자열을 거꾸로 한다.
Java
import java.util.ArrayList;
import java.util.List;
class Solution {
List<List<String>> result;
String s;
int length;
public List<List<String>> partition(String s) {
this.s = s;
this.length = s.length();
this.result = new ArrayList<>();
backtracking(0, new ArrayList<String>());
return result;
}
public void backtracking(int n, ArrayList<String> p) {
if (n == length) {
List<String> add = new ArrayList<>();
result.add(p);
}
String string;
StringBuilder sb;
for(int i = n + 1; i <= length; i++) {
string = this.s.substring(n, i);
sb = new StringBuilder(string);
// 문자열 뒤집어서 같으면 추가 하고 그 다음 진행 한다.
if(string.equals(sb.reverse().toString())) {
p.add(string);
backtracking(i,(ArrayList<String>) p.clone());
p.remove(p.lastIndexOf(string));
}
}
}
}
- StringBuilder(String): 문자열 연결할때 쓰는 Class이다. 그리고 .reverse() 문자열 뒤집는 메소드도 제공해준다.
- (ArrayList<String>) p.clone(): CallByValue로 인하여 .clone을 사용한다. 안 그러면 목록안에 리스트도 값에 영향을 준다.
- p.remove(p.lastIndexOf(string)): 탐색이 끝나면 리시트의 마지막 인덱스를 지워 줘야 한다.
728x90
반응형
'알고리즘 > Leetcode' 카테고리의 다른 글
[Leetcode] 1689. Partitioning Into Minimum Number Of Deci-Binary Numbers (1) | 2024.03.21 |
---|---|
[Leetcode] 1631. Path With Minimum Effort (0) | 2024.03.15 |
[Leetcode] 343. Integer Break (0) | 2024.03.09 |
[Leetcode] 146. LRU Cache (0) | 2024.03.06 |
[Leetcode] 1. Two Sum (0) | 2024.03.05 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 파이썬
- 구현
- 수학
- 백준
- 조합
- level2
- DFS
- 자바
- BFS
- DP
- Greedy
- BaekJoon
- Python
- 배열
- 이론
- 그래프
- 백트레킹
- spring-boot
- 동적계획법
- JSCODE
- 넓이 우선 탐색
- 그리디
- 알고리즘
- 재귀호출
- 동적 계획법
- LeetCode
- 누적합
- Programmerse
- 문자열
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함