题解 | #最长回文子串#

最长回文子串

http://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af

import java.util.*;

public class Solution {
    public int getLongestPalindrome(String A, int n) {
        //边界条件判断
        if (n < 2)
            return A.length();
        // 对于返回回文子串的问题,需要记录起始和结尾位置
        // start表示最长回文串开始的位置,end表示结束
        int start = 0,end = 0;
        //maxLen表示最长回文串的长度
        int maxLen = 1;

        // 从(i,i) 和 (i,i+1)开始扩展 找出以该点为起点的最长子串长度,从而确定start和end
        for(int i = 0;i < n; i++) {
            int len1 = getLen(A,i,i);
            int len2 = getLen(A,i,i+1);
            maxLen = Math.max(maxLen,Math.max(len1,len2));

            // 对于返回回文子串的问题
            if(maxLen > end - start + 1) {
                start = i - (maxLen - 1) / 2;
                end   = i + maxLen / 2; 
            }
        }

        //最长的回文子串长度
        return maxLen;
        //最长的回文子串
        // return A.substring(start,end+1); 
    }

    int getLen(String A,int i,int j){
        while(i >= 0 && j < A.length()) {
            if(A.charAt(i) != A.charAt(j)) {
                break;
            }
            i--;
            j++;
        }
        return j-i-1;
    }





//     public int getLongestPalindrome(String A, int n) {
//         //边界条件判断
//         if (n < 2)
//             return A.length();
//         //start表示最长回文串开始的位置,
//         //maxLen表示最长回文串的长度
//         int maxLen = 1;
//         boolean[][] dp = new boolean[n][n];
//         for (int right = 1; right < n; right++) {
//             for (int left = 0; left <= right; left++) {
//                 //如果两种字符不相同,肯定不能构成回文子串
//                 if (A.charAt(left) != A.charAt(right))
//                     continue;

//                 //下面是s.charAt(left)和s.charAt(right)两个
//                 //字符相同情况下的判断
//                 //如果只有一个字符,肯定是回文子串
//                 if (right == left) {
//                     dp[left][right] = true;
//                 } else if (right - left <= 2) {
//                     //类似于"aa"和"aba",也是回文子串
//                     dp[left][right] = true;
//                 } else {
//                     //类似于"a******a",要判断他是否是回文子串,只需要
//                     //判断"******"是否是回文子串即可
//                     dp[left][right] = dp[left + 1][right - 1];
//                 }
//                 //如果字符串从left到right是回文子串,只需要保存最长的即可
//                 if (dp[left][right] && right - left + 1 > maxLen) {
//                     maxLen = right - left + 1;
//                 }
//             }
//         }
//         //最长的回文子串
//         return maxLen;
//     }
}
全部评论

相关推荐

点赞 评论 收藏
分享
已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务