题解 | #最长回文子串#

最长回文子串

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

想了很久,之前写过一个通过了19组用例,差点气死。做出来了既高兴又气的要死。核心思想就是先中心判断,再两边判断。假如字符串是acbbcm,比较理想的模型.中心判断:char[1]与char[2]是否相等,如果相等判断char[1]与char[3],由此类推;如果char[1]不等于char[2],那么判断char[0]与char[2]是否相等,如果相等继续比较char[-1]和char[3],直到不相等,或者越界,然后计算临时长度,接着就是进入下一个中心判断,进入下一个中心也是有技巧的,字符串abbbcccd,第一个中心就是bbb,第二个中心就是ccc。博客写的不多,希望多多包含。

public int getLongestPalindrome(String string, int n) {
    char[] chars = string.toCharArray();
    if (n == 1){
        return 1;
    }
    if (n == 2){
        if (chars[0] == chars[1]){
            return 2;
        }else {
            return 0;
        }
    }
    int length = 0;
    int temp = 0;
    for (int i = 1;i< n-1;){
        int j = i+1;
        //中心判断
        while (chars[i] == chars[j]){
            j = j+1;
            //当字符串是abbbb类型的时
            if (j == n){
                if (i == 1){
                    if (chars[0] == chars[1]) return n;
                    return n-1;
                }
               temp = j-i;
               if (temp > length){
                   return temp;
               }else {
                   return length;
               }
            }
        }
        //记录位置,方便计算length,这里就不解释了,狗头保命
        int m = j;
        int k = i;
        //两边判断
        while (chars[i-1] == chars[j]){
            i = i-1;
            j = j+1;
            if (i == 0 || j == n){
               break;
            }
        }
        //最后计算长度
        temp = 2*j-k-m;
        if (temp > length) length = temp;
        //降低时间复杂度
        i = m;
    }
    return length;
}
全部评论

相关推荐

像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
11-09 01:22
已编辑
东南大学 Java
高级特工穿山甲:羡慕,我秋招有家企业在茶馆组织线下面试,约我过去“喝茶详谈”😢结果我去了发现原来是人家喝茶我看着
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务