LeetCode_214最短回文串

给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。

示例 1:

输入: “aacecaaa”
输出: “aaacecaaa”
示例 2:

输入: “abcd”
输出: “dcbabcd”

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-palindrome
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    public String shortestPalindrome(String s) {
        //首先判断输入的字符串是不是回文字符串
        int p = 0;
        int q = s.length()-1;
        while(p<=q){
            if(s.charAt(p)==s.charAt(q)){
                p++;
                q--;
            }else{
                break;
            }
        }
        if(p>q){
            return s;
        }
        //因为返回的是回文串,这里先将s倒转一下,方便处理
        StringBuilder sb = new StringBuilder(s);
        sb = sb.reverse();
        int len = sb.length();
        int cur = (len-1)/2;//当前指针所在位置
        //需要根据输入的字符串长度是奇数还是偶数,分别进行判断
        //普通情况:偶数,奇数但中心的单词不相等,例如:caeba e与b
        int i = cur-1;//从当前指针向左扩展
        int j = cur+1;//从当前指针向右扩展
        /**
        *因为从奇数中心扩散还是从偶数中心扩散接下来的迭代中
        *每次都要判断,情况比较复杂,这里投机了一下,先奇数中心扩散执行一遍
        *再偶数中心扩散执行一遍,然后取出这两种方式中的最短的字符串
        */
        //特殊情况:奇数且中心的单词相等,例如:caeea e与e
        // if(len%2==1 && sb.charAt(cur)==sb.charAt(cur+1)){
        //     i = cur;
        // }
        if(i<0){
            cur = cur+1;
            i = cur-1;
            j = cur+1;
        }
        while(i>=0 && j<len){
            char left = sb.charAt(i);
            char right = sb.charAt(j);
            if(left!=right){
                cur = cur+1;
                i = cur-1;
                j = cur+1;
                // if(cur+1
                //     // System.out.println(sb.charAt(cur)+"---"+sb.charAt(j));
                //     i = cur;
                // }
            }else{
                i--;
                j++;
            }
        }
        //j到达了末尾
        while(i>=0){
            sb.append(sb.charAt(i));
            i--;
        }


        StringBuilder sb2 = new StringBuilder(s);
        sb2 = sb2.reverse();
        int len2 = sb2.length();
        int cur2 = (len2-1)/2;//当前指针所在位置
        //需要根据输入的字符串长度是奇数还是偶数,分别进行判断
        //普通情况:偶数,奇数但中心的单词不相等,例如:caeba e与b
        int i2 = cur2;//从当前指针向左扩展
        int j2 = cur2+1;//从当前指针向右扩展
        if(i2<0){
            cur2 = cur2+1;
            i2 = cur2;
            j2 = cur2+1;
        }
        while(i2>=0 && j2<len2){
            char left = sb2.charAt(i2);
            char right = sb2.charAt(j2);
            if(left!=right){
                cur2 = cur2+1;
                i2 = cur2;
                j2 = cur2+1;
            }else{
                i2--;
                j2++;
            }
        }
        //j到达了末尾
        while(i2>=0){
            sb2.append(sb2.charAt(i2));
            i2--;
        }

        String s1 = sb.toString();
        String s2 = sb2.toString();
        if(s1.length()>s2.length()){
            return s2;
        }else{
            return s1;
        }
    }
}

你可能感兴趣的:(LeetCode题解)