dp[start][end]에 start부터 end까지의 부분 문자열이 팔린드롬인지 여부를 저장하였다. 1이면 팔린드롬이고 0이면 아직 체크되지 않은 값이며, -1이면 팔린드롬이 아니다.
이중 포문을 돌면서 i와 j를 시작과 끝으로 하는 문자열이 팔린드롬인지 아닌지를 체크하였다. 이미 체크한 문자열들을 다시 검사하지 않기 위해서 dp를 사용하였으며 O(n^2) 보다는 조금 더 느린 풀이이지만 통과되었다.
class Solution {
public int checkPalindrome(int[][] dp, int start, int end, String s) {
if (dp[start][end] != 0) {
return dp[start][end];
}
int len = end - start + 1;
if (len <= 1) {
dp[start][end] = 1;
} else if (s.charAt(end) == s.charAt(start)) {
dp[start][end] = checkPalindrome(dp, start + 1, end - 1, s);
} else {
dp[start][end] = -1;
}
return dp[start][end];
}
public String longestPalindrome(String s) {
int n = s.length();
int[][] dp = new int[n][n];
int maxLen = 0;
int start = 0;
int end = 0;
for (int i = 0; i < s.length(); i++) {
for (int j = 0; j < s.length(); j++) {
int len = j - i + 1;
if (len > maxLen && checkPalindrome(dp, i, j, s) == 1) {
maxLen = len;
start = i;
end = j + 1;
}
}
}
return s.substring(start, end);
}
}
반응형
'Algorithm > LeetCode' 카테고리의 다른 글
[Java] LeetCode 11번 Container With Most Water (0) | 2021.09.26 |
---|---|
[Java] LeetCode 10번 Regular Expression Matching (0) | 2021.09.26 |
[Java] LeetCode 4번 Median of Two Sorted Arrays (0) | 2021.09.25 |
[Java] LeetCode 3번 Longest Substring Without Repeating Characters (0) | 2021.09.24 |
[Java] LeetCode 2번 Add Two Numbers (0) | 2021.09.24 |