首页
首页 教程 派聪明
  • 首页
  • 教程
  • 派聪明
  • 登录
登录技术派畅享更多权益

用户名密码登录

其他登录:
绑定星球,畅享VIP服务

微信扫码/长按识别登录

输入验证码
有效期五分钟 👉 手动刷新

登录即同意 用户协议 和 隐私政策

绑定二哥编程星球,畅享 VIP 尊享服务!

戳我了解如何获取星球编号,新窗口打开

添加二哥微信 itwanger 审核更快

记得备注 星球编号
我会根据星球编号进行审核
1
两数之和
更新时间: 2023年12月09日
星球
2
两数相加
更新时间: 2023年12月10日
星球
3
无重复字符的最长子串
更新时间: 2023年12月12日
星球
4
寻找两个正序数组的中位数
更新时间: 2023年12月14日
星球
5
最长回文子串
更新时间: 2023年12月18日
星球
6
Z 字行变换
更新时间: 2023年12月26日
星球
7
整数反转
更新时间: 2023年12月28日
星球
8
字符串转成整数
更新时间: 2024年01月01日
星球
9
回文数
更新时间: 2024年01月03日
星球
10
正则式匹配
更新时间: 2024年01月17日
星球
11
盛最多水的容器
更新时间: 2024年01月20日
星球
12
整数转罗马数字
更新时间: 2024年01月21日
星球
13
罗马数字转整数
更新时间: 2024年01月22日
星球
14
最长公共前缀
更新时间: 2024年01月23日
星球
15
三数之和
更新时间: 2024年01月25日
星球
16
最接近的三数之和
更新时间: 2024年01月27日
星球
17
电话号码的字母组合
更新时间: 2024年01月29日
星球
18
四数之和
更新时间: 2024年01月30日
星球
19
删除链表中的倒数第N个节点
更新时间: 2024年01月31日
星球
20
有效的括号
更新时间: 2024年02月01日
星球
21
合并两个有序链表
更新时间: 2024年02月02日
星球
22
括号生成
更新时间: 2024年02月03日
星球
23
合并K个升序链表
更新时间: 2024年02月04日
星球
24
两两交换链表中的节点
更新时间: 2024年02月06日
星球
25
K个一组翻转链表
更新时间: 2024年02月07日
星球
26
删除有序数组中的重复项
更新时间: 2024年02月11日
星球
27
移除元素
更新时间: 2024年02月14日
星球
28
实现 strStr()
更新时间: 2024年02月19日
星球
29
两数相除
更新时间: 2024年02月22日
星球
30
串联所有单词的子串
更新时间: 2024年02月27日
星球
31
下一个排列
更新时间: 2024年02月29日
星球
32
最长有效括号
更新时间: 2024年05月30日
星球
33
搜索旋转排序数组
更新时间: 2024年06月03日
星球
34
在排序数组中查找元素的头尾位置
更新时间: 2024年06月14日
星球
35
搜索插入位置
更新时间: 2024年06月15日
星球
36
有效的数独
更新时间: 2024年06月16日
星球
37
解数独
更新时间: 2024年08月01日
星球
38
外观数列
更新时间: 2024年08月02日
星球
39
组合总和
更新时间: 2024年08月03日
星球
40
组合总和②
更新时间: 2024年08月04日
星球
41
缺失的第一个整数
更新时间: 2024年08月06日
星球
42
接雨水
更新时间: 2024年08月07日
星球
43
字符串相乘
更新时间: 2024年08月08日
星球
44
通配符匹配
更新时间: 2024年09月04日
星球
45
跳跃游戏
更新时间: 2024年09月06日
星球
46
全排列
更新时间: 2024年09月08日
星球
47
全排列②
更新时间: 2024年09月14日
星球
48
旋转图像
更新时间: 2024年09月18日
星球
49
字母异位词分组
更新时间: 2024年09月20日
星球
50
Pow(x, n)
更新时间: 2024年09月29日
星球
51
N 皇后
更新时间: 2024年11月14日
星球
52
N 皇后②
更新时间: 2024年11月14日
星球
53
最大子数组和
更新时间: 2024年11月16日
星球
54
螺旋矩阵
更新时间: 2024年11月20日
星球
55
跳跃游戏
更新时间: 2024年11月21日
星球
56
合并区间
更新时间: 2025年01月26日
星球
57
插入区间
更新时间: 2025年02月01日
星球
关注公众号
原创
二哥的 LeetCode 刷题笔记:005.最长回文子串

《二哥的 LeetCode 刷题笔记》真的容易懂。 ------------------------by鲁迅

题意

给你一个字符串 s,找到 s 中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例

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

难度

中等

分析 1

要解这道题,我们需要搞清楚几个概念:

  • 什么是字符串的反序?
  • 什么是回文串?
  • 什么是最长回文子串?

首先,字符串的反序就是将字符串中的字符顺序颠倒过来,例如:abc的反序就是cba。

其次,回文串就是正着看和反着看是一样的字符串,例如:abcba就是一个回文串,因为反着看也是abcba。

最后,最长回文子串就是在一个字符串中,最长的回文串,例如:abcba的最长回文子串就是abcba,而示例中的babad的最长回文子串就是bab或者aba。

那搞清楚这几个概念后,我们就很容易想到暴力解法:截取每一段子串,然后判断它是不是回文串,如果是的话,就更新最长回文子串。

class Solution {
    // 辅助函数,用于检查字符串 s 中从索引 begin 到 end 的子串是否为回文
    boolean isPalindrome(String s, int begin, int end) {
        while (begin <= end) {
            // 如果两端的字符不同,则不是回文
            if (s.charAt(begin) != s.charAt(end))
                return false;
            // 向中间移动
            begin++;
            end--;
        }
        // 如果所有字符都相同,则是回文
        return true;
    }

    // 主函数,用于找出字符串 s 中的最长回文子串
    public String longestPalindrome(String s) {
        int ansl = 0, ansr = 0; // 存储最长回文子串的起始和结束索引
        // 外层循环遍历子串的起始位置
        for (int i = 0; i < s.length(); i++)
            // 内层循环遍历子串的结束位置
            for (int j = i; j < s.length(); j++)
                // 检查子串是否是回文
                if (isPalindrome(s, i, j)) {
                    // 如果找到更长的回文子串,则更新最长回文子串的索引
                    if (j - i > ansr - ansl) {
                        ansr = j;
                        ansl = i;
                    }
                }
        // 返回最长回文子串
        return s.substring(ansl, ansr + 1);
    }
}

但是,结果非常感人……

完全无法接受的结果,两层循环 $O(n^2)$ 的时间复杂度,再加上判断回文串又是 $O(n)$ 的时间复杂度,所以总共是 $O(n^3)$ 的时间复杂度,这完完全全超出了题目预期的范围。

分析 2

我们来想想其他的方法。

“回文串”,意思就是正着看和反着看是一样的。

那我们是不是能够通过求这个字符串倒置之后的串和原串的最长公共子串,得到的这个最长公共子串,也就是原串的最长回文子串?

是的,见下图。

但是有一个问题。

例如:adccdcda,它倒置之后是adcdccda,两个串的最长公共子串则是adc或者cda,可是这两个显然不是回文子串。

问题就出在位置的判断上。

除了要判断是不是最长公共子串,还需要多一个判断,看看这个最长公共子串在原串中的位置和倒置之后的串中的位置是不是对应的。

求解两个字符串的最长公共子串,我们可以用动态规划来解决。

什么是动态规划?

动态规划(Dynamic programming,简称 DP)是一种在数学、计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复

已加入二哥编程星球,即刻绑定星球编号解锁🔐
该文档仅「二哥编程星球」的VIP用户可见

二哥的编程星球内容包括:

1. 付费文档: 技术派、MYDB 等项目配套的 120+篇教程查看权限

2. 面试指南: 校招、社招的 40 万+字面试求职攻略

3. 智能助手: 无限期使用派聪明 AI 助手,已对接讯飞星火和 ChatGPT双通道,不用花 1 分钱

4. 专属问答: 向二哥 1v1 发起提问,内容不限于 offer 选择、学习路线、职业规划等

5. 简历修改: 提供简历修改服务,附赠星球 100+优质简历模板可供参考

6. 学习环境: 打造一个沉浸式的学习环境,有一种高考冲刺、大学考研的氛围


二哥的星球

》步骤①:微信扫描上方二维码,点击「加入知识星球」按钮

》步骤②:访问星球置顶帖球友必看: https://t.zsxq.com/11rEo9Pdu,获取项目配套文档的语雀访问地址和密码

已加入星球,绑定星球编号
删除提醒

确定删除《二哥的 LeetCode 刷题笔记:005.最长回文子串》吗

3人已点赞

回复

目录

分享文章
分享二维码