skyke

求真求实,大气大为!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
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  阅读(116)  评论(0编辑  收藏  举报