| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 数据结构与算法 -> 最长回文子串 -> 正文阅读 |
|
|
[数据结构与算法]最长回文子串 |
题目描述给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s = "babad" 输入:s = "cbbd" 来源:力扣(LeetCode) 代码实现
思路整理这个题目我还是挺自豪的,第一时间就想到了正确的思路,虽然不知道运用了什么原理。 首先第一念头必定是暴力手段,列举出所有子串。但是明显不合适。 我想的是,回文以中间为对称轴,两边的字符必定是对称相等的。 所以先遍历字符串,使每一个字符作为回文子串的中心字符,然后给定一个h,判断以索引处为中心,s.charAt(i - h)和s.charAt(i + h)是否相同,如果相同就h++,继续左移和右移判断是否相同,这样就可以判断以索引为i处的字符为中心的最长回文子串。先给定一个j和count,用来记录最大回文子串处的i和h。这样最后截取s.substring(j - count,j +count +1)作为即可。 要注意的是,因为s.charAt(i - h)和s.charAt(i + h)相同后要h++继续判断下两个字符,所以到最后h是多加了一个1,所以循环判定完后i--即可。 尝试一把,发现{b,b}不对,是我忽略了回文子串长度为偶数的情况,也不用着急,使用类似的思路加一层判定即可,原本是i -?h 和i +?h处字符判断是否相等,现在是i - h 和i +h -1处字符是否相等,即回文字符中心是i - 1 和i + 1 - 1(即i)。原本的h,j,count设成h0,j0,count0即可。 最后加一层逻辑判断,由于count == count0时截取的字符偶数字符串要少一个字符,所以必须count0 > count才使用偶数的count0,j0进行截取。 最后我怕也去看了官方题解,这里采用的是动态规划思想,把回文子串的对称字符一层层去掉,他仍是回文串,所以去到最后变成了一个字符或者空串。
? |
|
|
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/5 5:36:56- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |