马拉车算法

最长回文子串

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

   public int getLongestPalindrome(String s,int n) {
        StringBuilder sb = new StringBuilder();
        sb.append("$#"); //这里可以在前后添加字符防止后面越界,不加的话while中心扩展时需要判断越界
        for (int i = 0; i < s.length(); ++i) {
            sb.append(s.charAt(i));
            sb.append('#');
        }
        sb.append('&');
        char[] chars = sb.toString().toCharArray();

        int p[] = new int[chars.length]; //存储第i位的回文半径(不包含自己的一边长度)
        int C = 0; //中心
        int R = 0; //最右边界
        int C_max = 0;//最大回文中心
        int R_max = 0;//最大回文半径
        for (int i = 1; i < chars.length - 1; i++) {
            int i_mirror = 2 * C - i; //i关于C的对称点
            if (i<R) { //保证i还在最右边界内
                p[i] = Math.min(R - i, p[i_mirror]); //这里画图理解
                /*
                 *   -----RM----iM-----C-----i-------R------
                 *   RM~R是关于C对称的,里面的IM也和i对称,
                 *   如果iM的回文半径小于R-i, i的回文半径等于iM的回文
                 *   否则就是iM的回文半径取R-i,超出的无法判断。
                 * */
            }

            //其他情况,利用中心扩展
            while ( chars[i + 1 + p[i]] == chars[i - 1 - p[i]]) p[i]++;

            //更新回文半径
            if (i + p[i] > R) {
                C = i;
                R = i + p[i];
            }
            //更新最大回文
            if (R_max < p[i]){
                C_max = i;
                R_max = p[i];
            }
        }
        return R_max; //(C_max + R_max )/2 - (C_max - R_max )/2
    }
全部评论

相关推荐

11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
11-11 14:21
西京学院 C++
Java抽象练习生:教育背景放最前面,不要耍小聪明
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务