Leetcode 0005 : 가장 긴 회문 부분 문자열

제목 설명:

문자열 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 )

  1. 현재 위치에서 시작하여 양쪽으로 퍼지는 배열의 각 위치 i를 열거합니다.
  2. 회문 부분 문자열의 길이가 홀수이면 i에서 시작하여 양쪽으로 퍼집니다.
  3. 회문 부분 문자열의 길이가 짝수이면 i, i + 1에서 시작하여 양쪽으로 퍼집니다.
  4. 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;
        }
    }
}

추천

출처blog.csdn.net/weixin_43946031/article/details/113798830