LeetCode 解题思路 47(最长回文子串、最长公共子序列)

解题思路:

  1. dp 数组的含义: dp[i][j] 是否为回文子串。
  2. 递推公式: dp[i][j] = s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]。
  3. dp 数组初始化: 单字符 dp[i][i] = true,双字符 dp[i][i + 1] = s.charAt(i) == s.charAt(i + 1)。
  4. 遍历顺序: 从 3 开始遍历,寻找最长回文子串。
  5. 打印 dp 数组

Java代码:

java 复制代码
public class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        boolean[][] dp = new boolean[n][n];
        int maxLen = 1;
        int start = 0;

        for (int i = 0; i < n; i++) dp[i][i] = true;

        for (int i = 0; i < n - 1; i++) {
            if (s.charAt(i) == s.charAt(i + 1)) {
                dp[i][i + 1] = true;
                maxLen = 2;
                start = i;
            }
        }

        for (int len = 3; len <= n; len++) {
            for (int i = 0; i <= n - len; i++) {
                int j = i + len - 1;
                if (s.charAt(i) == s.charAt(j) && dp[i + 1][j - 1]) {
                    dp[i][j] = true;
                    maxLen = len;
                    start = i;
                }
            }
        }

        return s.substring(start, start + maxLen);
    }
}

复杂度分析:

  • 时间复杂度: O(n²)。
  • 空间复杂度: O(1)。

解题思路:

  1. dp 数组的含义: 长度为 [0, i - 1] 的字符串 text1 与长度为 [0, j - 1] 的字符串 text2 的最长公共子序列为 dp[i][j]。
  2. 递推公式:
java 复制代码
if (text1[i - 1] == text2[j - 1]) {
    dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
  1. dp 数组初始化: dp[i][0] = 0,dp[0][j] = 0。
  2. 遍历顺序: 从小到大逐行遍历,确保左边和上边的 dp 数组有值。
  3. 打印 dp 数组

Java代码:

java 复制代码
class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        int[][] dp = new int[text1.length() + 1][text2.length() + 1];
    
        for (int i = 1; i <= text1.length() ; i++) {
            char char1 = text1.charAt(i - 1);
            for (int j = 1; j <= text2.length(); j++) {
                char char2 = text2.charAt(j - 1);
                if (char1 == char2) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        
        return dp[text1.length()][text2.length()];
    }
}

复杂度分析:

  • 时间复杂度: O(mn),其中 m 和 n 分别为 text1 和 text2 的长度。
  • 空间复杂度: O(mn)。
相关推荐
CoderYanger1 小时前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
jllllyuz1 小时前
Matlab实现基于Matrix Pencil算法实现声源信号角度和时间估计
开发语言·算法·matlab
夏鹏今天学习了吗1 小时前
【LeetCode热题100(72/100)】前 K 个高频元素
leetcode
稚辉君.MCA_P8_Java1 小时前
DeepSeek 插入排序
linux·后端·算法·架构·排序算法
多多*1 小时前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
덕화2 小时前
【面试宝典】线上问题逆向分析1
面试·职场和发展
美团程序员2 小时前
一篇文章教你搞定:”xx 功能如何测试?“常见面试题型!
测试工具·面试·职场和发展·测试用例
.YM.Z3 小时前
【数据结构】:排序(一)
数据结构·算法·排序算法
Chat_zhanggong3453 小时前
K4A8G165WC-BITD产品推荐
人工智能·嵌入式硬件·算法
百***48073 小时前
【Golang】slice切片
开发语言·算法·golang