제목 설명:
문자열 s가 주어지면 s에서 가장 긴 회문 부분 문자열을 반환합니다.
예 1 :
입력 : s = "babad"
출력 : "bab"
참고 : "aba"도 유효한 대답입니다.
예 2 :
입력 : s = "cbbd"
출력 : "bb"
예 3 :
입력 : s = "a"
출력 : "a"
예 4 :
입력 : s = "ac"
출력 : "a"
제약 :
1 <= s.length <= 1000
s는 숫자와 영어 문자 (소문자 및 / 또는 대문자)로만 구성됩니다.
시간 복잡도 : O (n 2) \ Omicron (n ^ {2}) \,O ( n2 )
- 현재 위치에서 시작하여 양쪽으로 퍼지는 배열의 각 위치 i를 열거합니다.
- 회문 부분 문자열의 길이가 홀수이면 i에서 시작하여 양쪽으로 퍼집니다.
- 회문 부분 문자열의 길이가 짝수이면 i, i + 1에서 시작하여 양쪽으로 퍼집니다.
- start는 현재 가장 긴 회문 부분 문자열의 시작 포인터를 저장하고 end는 현재 가장 긴 회문 부분 문자열의 끝 포인터를 저장합니다.
class Solution {
// 1. set center
// 2. left <- center -> right check
int start, end;
public String longestPalindrome(String s) {
if (s == null || s.length() < 1) return "";
int n = s.length();
for(int i = 0; i < n; i++){
// check odd
helper(s, i-1, i+1);
// check even
helper(s, i, i+1);
}
return s.substring(start+1, end);
}
private void helper(String s, int left, int right){
int l = left;
int r = right;
while(l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)){
l--;
r++;
}
if(end - start < r - l){
start = l;
end = r;
}
}
}