leetcode 05 回文字符串

leetcode 05 回文字符串

1. 描述

给你一个字符串,找到里面最长的回文字符串

2. 事例

示例 1:

复制代码
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

复制代码
输入:s = "cbbd"
输出:"bb"

3. 思路

3.1 什么是回文字串

python 复制代码
abba
abcba

我们把这种不管是从前到后读还是从后到前读都是一样的单词叫做回文字串

3.2 思路

3.2.1 dp数组

明确一个dp数组,即当前dp数组每个下标对应的含义

python 复制代码
dp[i][j] 表示s的前i个字符到j个字符是否符合回文字串。
字符串 á b c b a
下标 0 1 2 3 4
i/j 0 1 2 3 4
0 True False False False True
1 True False True False
2 True False False
3 True False
4 True
3.2.2 怎么判断当前子串是回文字串。

d p [ i ] [ j ] = s [ i ] = = s [ j ] a n d s [ i + 1 ] [ j − 1 ] o r j − 1 < = 2 dp[i][j] = s[i] == s[j] and s[i+1][j-1] or j - 1 <= 2 dp[i][j]=s[i]==s[j]ands[i+1][j−1]orj−1<=2

假设我现在有个字符串aba

当s[i]和s[j]等于当时候,我们就需要判断从i到j里面包含了几个字符。

比如当i = 0 j = 2当是时候,如果s[i] = s[j] 就只需要判断里面的元素是否大于1了,我们就可以得到一个公式。
j − i < = 2 j - i <= 2 j−i<=2

如果这个公式成立的话,并且s[i] = s[j] 那么就是一个回文字串。

只需要判断s[i] == s[j] 并且 s[i + 1] [j - 1] 或者 j - i <= 2。

3.3.3 怎么取最大的回文字串。

我们上面知道了怎么判断字串是回文字串,我们就可以先定义一个left,并记录一个最大的长度。然后每次是回文字串的时候判断是否大于已经记录的,如果大于则就进行替换,如果小宇我们就跳过。

注意!!! 这里我们要注意下。

这里的最大长度应该好似j - i + 1.

3.3.4 代码编写
3.3.4.1 python
python 复制代码
def longestPalindrome(s: str) -> str:
    if len(s) <= 1:
        return s
    left = 0
    maxLength = 1
    dp = [[False for i in range(len(s))] for i in range(len(s))]
    for j in range(1, len(s)):
        for i in range(j):
            if s[i] != s[j]:
                continue
            else:
                dp[i][j] = dp[i + 1][j - 1] or j - i <= 2
            if dp[i][j] and j - i + 1 > maxLength:
                left = i
                maxLength = j - i + 1
    return s[left: left + maxLength]
3.3.4.2 typescript
typescript 复制代码
onst longestPalindrome = (s: string): string => {
    if (s.length <= 1) return s;
    let left = 0, maxlength = 1;
    const dp = new Array(s.length).fill(0).map(item => new Array(s.length).fill(false));
    for (let j = 1; j < s.length; j++) {
        for (let i = 0; i < j; i++) {
            if (s[i] !== s[j]) continue;
            dp[i][j] = dp[i + 1][j - 1] || j - i <= 2;
            if (dp[i][j] && j - i + 1 > maxlength) {
                maxlength = j - i + 1;
                left = i;
            }
        }
    }
    return s.slice(left, left + maxlength)
}
java
java 复制代码
 public static String longestPalindromeV2(String s) {
        int left = 0;
        int maxLength = 1;
        boolean[][] dp = new boolean[s.length() + 1][s.length() + 1];
        if (s.length() <= 1) return s;
        for (int j = 1; j < s.length(); j++) {
            for (int i = 0; i < j; i++) {
                if (s.charAt(i) != s.charAt(j)) {
                    continue;
                } else {
                    dp[i][j] = dp[i + 1][j - 1] || j - i <= 2;
                }
                if (dp[i][j] && j - i + 1 > maxLength) {
                    maxLength = j - i + 1;
                    left = i;
                }
            }
        }
        return s.substring(left, left + maxLength);
    }
相关推荐
LYFlied19 分钟前
【每日算法】LeetCode 64. 最小路径和(多维动态规划)
数据结构·算法·leetcode·动态规划
Salt_07281 小时前
DAY44 简单 CNN
python·深度学习·神经网络·算法·机器学习·计算机视觉·cnn
货拉拉技术1 小时前
AI拍货选车,开启拉货新体验
算法
MobotStone1 小时前
一夜蒸发1000亿美元后,Google用什么夺回AI王座
算法
Wang201220131 小时前
RNN和LSTM对比
人工智能·算法·架构
xueyongfu1 小时前
从Diffusion到VLA pi0(π0)
人工智能·算法·stable diffusion
永远睡不够的入1 小时前
快排(非递归)和归并的实现
数据结构·算法·深度优先
cheems95271 小时前
二叉树深搜算法练习(一)
数据结构·算法
sin_hielo1 小时前
leetcode 3074
数据结构·算法·leetcode
Yzzz-F2 小时前
算法竞赛进阶指南 动态规划 背包
算法·动态规划