Leetcode Java Palindrome Partitioning II
업데이트:
문제
코드
class Solution {
public int minCut(String s) {
boolean dp[][] = new boolean[s.length() + 1][s.length() + 1];
int min[] = new int[s.length()];
for (int i = 0; i < s.length(); i++) {
min[i] = i;
for (int j = 0; j <= i; j++) {
if (s.charAt(i) == s.charAt(j) && (j + 1 > i - 1 || dp[j + 1][i - 1])) {
dp[j][i] = true;
min[i] = j == 0 ? 0 : Math.min(min[i], min[j - 1] + 1);
}
}
}
return min[s.length() - 1];
}
}
결과
설명
-
이전의 Palindrome Partitioning과 유사한 문제로, 주어진 문자열 s를 앞뒤로 읽어도 같은 문자열(이하 회문)의 조합으로 자르기 위한 최소 횟수를 구하는 문제이다.
- 문제 풀이에 필요한 변수를 정의한다.
- DP를 저장할 dp를 2차원 boolean 배열의 $s.legnth() + 1 \times s.length() + 1$ 크기로 정의한다.
- 최소 횟수를 저장할 정수 배열인 min을 s.length() 크기로 정의한다.
- 문자열 s의 처음부터 길이만큼 반복하여 회문의 조합으로 자르기 위한 최소 횟수를 구한다.
- min[i]에 i값을 기본값 으로 넣어준다.
- 다시 문자열 s의 처음부터 i까지 반복하여준다.
- 문자열 s의 i번째 문자와 j번째 문자가 동일하고, $j + 1$이 $i - 1$보다 크거나 dp[$j + 1$][$i - 1$]의 값이 true 일 경우 아래를 수행한다.
- dp[j][i]에 true를 넣어준다.
- min[i]에 j가 0일 경우 0을, 그렇지 않은 경우 min[i]와 min[j - 1] + 1 중 작은 값을 넣어준다.
- 문자열 s의 i번째 문자와 j번째 문자가 동일하고, $j + 1$이 $i - 1$보다 크거나 dp[$j + 1$][$i - 1$]의 값이 true 일 경우 아래를 수행한다.
- 반복이 완료되면 회문의 조합으로 자르기 위한 최소 횟수를 저장한 배열 min의 마지막 값인 min[$s.length() - 1$]을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기