比较经典的回文判断题型。由于题目要求时间复杂度为O(n^2),故考虑较为直接的暴力解法。
使用一个二重循环,第一重循环i从数组的第一个元素开始,第二重循环j从数组的最后一个元素开始,每趟循环都判断从i到j是否构成回文,若构成,则直接退出内层循环,在外层更新最大值。当i到j的字符串长度小于最大值时,直接退出内层循环,不更新最大值。
这样做的好处是,当一个很长的字符串本身就是一个回文时,时间复杂度无限接近O(n)。而最坏的情况,一个很长的字符串中不存在回文时,时间复杂度则介于O(n^2)与O(n^3)之间。平均时间复杂度介于O(nlogn)与O(n^2)之间,满足题目要求。而不借助辅助数组,故空间复杂度为O(1)。
这里判断给定的字符串是否是回文的逻辑也稍微提一下。从字符串两端开始向中间比较,一旦发现有不一样的两个字符,则不是回文。

class Solution {
public:
    int getLongestPalindrome(string A, int n) {
        // write code here
        int max = 1;
        for(int i = 0;i < A.length();i++){
            int len = 1;
            int j = 0;
            bool beenCut = false;
            for(j = n - 1;j>i;j--){
                //cut
                if(j-i+1 < max){
                    beenCut = true;
                    break;
                }
                if(judge(A.substr(i,j-i+1))){
                    break;
                }
            }
            if(beenCut){
                len = 1;
            }
            else{
                len = j - i + 1;
            }
            if(len > max){
                max = len;
            }
        }
        return max;
    }
    bool judge(string s){
        for(int i = 0;i < s.length()/2;i++){
            if(s[i] != s[s.length() - 1 - i]){
                return false;
            }
        }
        return true;
    }
};