5. 最长回文子串

5. 最长回文子串

复制代码
package 动态规划;

public class 最长回文子串 {
    public static void main(String[] args) {
        String s = "aaaa";
        最长回文子串 o = new 最长回文子串();
        System.out.println(o.longestPalindrome(s));
    }


    // 动态规划解法
    // 定义状态:dp[i][j]表示从i到j字符是回文串
    // 设置初始状态: j-i=0时候dp[i][j]=1,j-i=i时,若c[i]==c[j]时候dp[i][j]=1
    // 状态转移方程:dp[i+1][j-1]=1 && c[i]==c[j] 时候,dp[i][j]=1
    public String longestPalindrome(String s) {
        if (s == null || s.length() == 0 || s.length() == 1) {
            return s;
        }
        char[] c = s.toCharArray();
        int[][] dps = new int[s.length()][s.length()];
        int maxLength = 0;
        int start = 0;
        // 之所以先确定j的值在确定i的值,是因为二维数组的表格填表顺序决定的
        // 只有确定了上一个元素的值,才能推下一个元素的值
        for (int j = 0; j < dps.length; j++) {
            for (int i = 0; i < j; i++) {
                if ((j - i) <= 2) {
                    if (c[i] == c[j]) {
                        dps[i][j] = 1;
                    }
                } else {
                    if (dps[i + 1][j - 1] == 1 && c[i] == c[j]) {
                        dps[i][j] = 1;
                    }
                }
                if (dps[i][j] == 1) {
                    if (j - i + 1 > maxLength) {
                        maxLength = j - i + 1;
                        start = i;
                    }
                }
            }
        }
        return s.substring(start, start + maxLength);
    }


}
复制代码

 

..

posted @   guoyu1  阅读(31)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-11-29 23种设计模式分类
点击右上角即可分享
微信分享提示