• 5. 最长回文子串


    ——————————————————— 原来这世上,比之成双鸳侣,多的却是相思枉然 ———————————————————

    题目
    给你一个字符串 s,找到 s 中最长的回文子串。
    输入:s = “babad”
    输出:“bab”
    解释:“aba” 同样是符合题意的答案。

    最长回文子串可以考虑用动态规划。动态规划的三个步骤:
    1、寻找状态转移条件。用 Sij 表示 i - j 之间的子串,当 Si != Sj 时,Sij 不是回文子串;当 Si == Sj 时,需要判断 Si+1j-1 是否存在,如果 (j - 1) - (i + 1) + 1 < 2,即 j - i < 3 时,Si+1j-1 必为回文子串,则 Sij 是回文子串。否则根据 Si+1j-1 判断。
    2、寻找边界条件。
    3、写出状态转移方程。

    class Solution {
        String longestPalindrome(String s) {
            int len = s.length();
            if (len < 2) { // 当字符串为空或者长度为1时
                return s;
            }
    
            int maxLen = 1; // 回文子串的长度最少为1
            int begin = 0;
            boolean[][] dp = new boolean[len][len];
            for (int i = 0; i < len; i++) {
                dp[i][i] = true; // 将对角线元素重置为true
            }
    
            char[] charArray = s.toCharArray();
            for (int j = 1; j < len; ++j) { // 从左至右,按列开始更新
                for (int i = 0; i < j; ++i) { // 结束条件为i<j,即是对角线
                    if (charArray[i] != charArray[j]) {
                        dp[i][j] = false; // 如果i和j不相等,那么Sij一定不是回文子串
                    } else {
                        if (j - i < 3) {
                            dp[i][j] = true; // j-i<3 也就是(j-1)-(i+1)+1<=2,
                            // 即S(i+1,j-1)不存在或者为1,那么Si=Sj时Sij必为回文子串
                        } else {
                            dp[i][j] = dp[i + 1][j - 1]; // 其他情况时需要根据S(i+1,j-1)判断
                        }
                    }
                    if (dp[i][j] && j - i + 1 > maxLen) {
                        maxLen = j - i + 1;
                        begin = i;
                    }
                }
            }
            return s.substring(begin, begin + maxLen);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    2023年MySQL实战核心技术第二篇
    ElasticSearch-Head 数据浏览406问题解决
    多线程的概念(多线程的代码实现)
    Redis—问题(1)
    JAVA中的文件操作
    【R1CS to QAP】
    知识图谱应用---智慧医疗
    1Panel应用推荐:KubePi开源Kubernetes管理面板
    JAVA基础学习笔记(4) 程序控制结构
    内存分段与内存分页:逻辑地址、物理地址、线性地址、虚拟地址
  • 原文地址:https://blog.csdn.net/qq_43217697/article/details/125563728