代码着色

public int longestPalindrome(String s) {
    //预处理
    char[] chars = s.toCharArray();
    StringJoiner joiner = new StringJoiner("#");
    joiner.add("");
    for (char c : chars) {
        joiner.add(String.valueOf(c));
    }
    joiner.add("");
    String exString = joiner.toString();
    int size = exString.length();
    int[] RL = new int[size];
    int MaxRight = 0, pos = 0, MaxLen = 0;
    for (int i = 0; i < size; i++) {
        if (i < MaxRight) {
            RL[i] = Math.min(RL[2 * pos - i], MaxRight - i);
        } else {
            RL[i] = 1;
        }
        //尝试扩展
        while (i - RL[i] >= 0 && i + RL[i] < size && exString.charAt(i - RL[i]) == exString.charAt(i + RL[i])) {
            RL[i]++;
        }
        //更新MaxRight,pos
        if (RL[i] + i - 1 > MaxRight) {
            MaxRight = RL[i] + i - 1;
            pos = i;
        }
        //更新最大长度
        MaxLen = Math.max(MaxLen, RL[i]);
    }
    return MaxLen - 1;
}
public int dpLongestPalindrome(String s) {
    int n = s.length();
    boolean[][] pal = new boolean[n][n];
    //pal[i][j] 表示s[i...j]是否是回文串
    int maxLen = 0;
    for (int i = 0; i < n; i++) {  // i作为终点
        int j = i;    //j作为起点
        while (j >= 0) {
            if (s.charAt(j) == s.charAt(i) && (i - j < 2 || pal[j + 1][i - 1])) {
                pal[j][i] = true;
                maxLen = Math.max(maxLen, i - j + 1);
            }
            j--;
        }
    }
    return maxLen;
}

 

posted on 2017-08-20 11:30 skyke 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/skyke/p/7399357.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值