[leetcode-214]Shortest Palindrome(java)

3665 단어 leetcode
문제 설명: 문자열 S 를 감안 할 때 앞 에 문 자 를 추가 하여 팔레트 로 변환 할 수 있 습 니 다. 이 변환 을 수행 하여 찾 을 수 있 는 가장 짧 은 팔레트 를 찾 아서 반환 합 니 다.
For example:
Given “aacecaaa”, return “aaacecaaa”.
Given “abcd”, return “dcbabcd”.
분석: 이 문 제 는 제 생각 이 비교적 간단 합 니 다. 답문 을 보완 하려 면 중간 부터 효과 적 인 구조 답문 의 접경 점 인지 판단 하 세 요.그렇지 않다 면 base –, 여기 서 주의해 야 할 것 은 모든 base 에 있어 두 가지 가능성 이 있 습 니 다. 하 나 는 홀수 형 이 고, 다른 하 나 는 짝수 형 입 니 다.이런 방법 은 시간 복잡 도 는 O (n2) 이 고 O (n) 의 해결 방안 도 있 으 며 사용 하 는 Manacher 알고리즘 이 라 고 합 니 다.
운행 시간: 336 ms
public class Solution {
      public String shortestPalindrome(String s) {
        char[] chars = s.toCharArray();
         if(chars.length<=0)
            return "";

        int length = chars.length;
        int base = (length-1)/2;

        boolean isOdd = true;
        while (base>=0){
            if(isValid(chars,base,base+1)) {
                isOdd = false;
                break;
            }
            if(isValid(chars,base,base))
                break;
            base--;
        }
        StringBuilder builder = new StringBuilder();
        int index = length-1;
        while(index>=base){
            builder.append(chars[index--]);
        }
        int oneSize = builder.length();
        if(isOdd)//     
            index = oneSize-2;
        else{
            builder.deleteCharAt(oneSize-1);
            index = oneSize-2;
        }
        while(index>=0)
            builder.append(builder.charAt(index--));
        return builder.toString();
    }
    private boolean isValid(char[] chars,int left,int right){
        while(left>=0){
            if(right>=chars.length || chars[left]!=chars[right])
                return false;
            left--;right++;
        }
        return true;
    }
}

좋은 웹페이지 즐겨찾기