首页 > 其他 > 详细

代码着色

时间:2017-08-20 12:22:09      阅读:274      评论:0      收藏:0      [点我收藏+]
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;
}

 

代码着色

原文:http://www.cnblogs.com/skyke/p/7399357.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!