public String longestPalindrome(String s) { if (s == null || s.length() < 1) return ""; int start = 0; // 정답 팰린드롬 시작 인덱스 int end = 0; // 정답 팰린드롬 끝 인덱스 for (int i = 0; i < s.length(); i++) { // 홀수 길이 팰린드롬 체크 int len1 = expandFromCenter(s, i, i); // 짝수 길이 팰린드롬 체크 int len2 = expandFromCenter(s, i, i + 1); // 두 길이 중 더 긴 것을 선택 int len = Math.max(len1, len2); // 만약 기존에 찾은 팰린드롬보다 길다면 start, end 갱신 if (len > end - start) { // 새로 찾은 팰린드롬의 시작 인덱스 계산 start = i - (len - 1) / 2; // 새로 찾은 팰린드롬의 끝 인덱스 계산 end = i + len / 2; } } // s.substring(a, b)는 b-1까지 포함하므로 end+1 return s.substring(start, end + 1);}private int expandFromCenter(String s, int left, int right) { while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) { left--; right++; } return right - left - 1;}
DP
public String longestPalindrome(String s) { int n = s.length(); boolean[][] dp = new boolean[n][n]; String res = ""; for (int len = 1; len <= n; len++) { for (int i = 0; i <= n - len; i++) { int j = i + len - 1; if (s.charAt(i) == s.charAt(j) && (len <= 2 || dp[i+1][j-1])) { dp[i][j] = true; // true 면 팰린드롬이라는 의미임. if (len > res.length()) { res = s.substring(i, j + 1); } } } } return res;}