最长回文串问题(leetCode 5)

本文详细介绍了如何解决LeetCode第5题——寻找给定字符串中的最长回文子串。通过问题描述、示例和三种不同方法(公共最长子序列法、暴力法、动态规划)进行深入分析,并提供了相应的算法思路和代码实现,帮助理解回文串的查找策略。
摘要由CSDN通过智能技术生成

问题描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

问题分析

回文串的意思是“从前往后读和从后往前读是一样的”,举个简单的例子“上海自来水来自海上”。

所以这里我们可以将原字符串反转,求两个字符串的最长公共子序列。

例如:abbc 的反转 cbba,他们的最长公共子序列就是“bb”也就是所求。通过反转之后求最长公共子序列来模拟从前往后和从后往前读取的过程。

这里需要特别注意的一点是 不是所有的公共子序列一定满足条件。例如字符串 abcdba,它的反转abdcba 和它的最长公共子序列为"ab",但是显然ab不是答案所求。所以我们在判断的时候一定要检查最长公共子序列在原字符串中的索引,是否对应的就是反转后的那一块索引

公共最长子序列法

public String longestPalindrome(String s) {
    if (s.isEmpty() || s.length() == 1) {
        return s;
    }
    char[] a = s.toCharArray();
    int l = a.length;
    int[][] temp = new int[l][l];
    int max = 0, index = 0;
    for (int i = 0; i < l; i++) {
        for (int j = 0; j < l; j++) {
            if (a[i] == a[l - j - 1]) {
                if (i > 0 && j > 0) {
                    temp[i][j] = temp[i - 1][j - 1] + 1;
                } else {
                    temp[i][j] = 1;
                }
                if (max < temp[i][j] && l - 1 - i == j - temp[i][j] +
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值