LeetCode第5题最长回文子串

2023年 8月 23日 52.6k 0

继续打卡算法题,今天学习的是第LeetCode的第5题最长回文子串,这道题目是道中等题,第4题是困难题,默认跳过了,哈哈哈。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码能力有一些帮助。

image.png

分析一波题目

这个题目考查的回文,回文串(i,j)有一个特点,它的临近子串(i+1,j-1)也是一个回文串,比如回文串abba,那么bb也是一个回文。

这个题目如果使用暴力解法,也就是穷举,也是可以做出来的,我们应该会想到两层循环,每次计算以每个字符开始,到最后一个元素,循环出所有的子串,并记录最大的回文串。

以cbbd为例子,从前往后找子串,把每个元素开头的所有情况都穷举出来。

以c开头的字符串

c
cb 
cbb
cbbd

以第一个b开头

b
bb
bbd

以第二个b开头

b
bd

以d开头

d

上面是从头往后遍历,查找回文的过程。发现有一个特点,从前往后找的字符串子串都在后面。

假如我们是从后往前找呢? 这样前面的往前找的子字符串之前就出现了,这是个巧妙的地方。

我们试着从后往前找子串。还是上面cbbd的例子

以d开头

d

以倒数第一个b开头

b
bd

以第二个b开头

b
bb
bbd

以c开头的字符串

c
cb 
cbb
cbbd

这样看就很有特点了。后面遍历的子串,前面都已经遍历过了。这样我们只要把前面遍历过的子串记录下来,这样就可以减少很多重复的判断。

这种根据子问题求解的情况,其实属于动态规划算法。

我们可以使用一个二维数组来表示字符串是否是回文串。

boolean[][] strArr = new int[length][length];

还是以cbbd为例子。

strArr[0][0] = true 代表第一个字c是回文串。

strArr[0][1] = false 代表cb不是回文。

假设我们使用i,j为下标,分别从后往前开始填这个二维数组。下面以abaab为例

image.png

编码实现

class Solution {
public String longestPalindrome(String A) {
//记录最长回文串的长度
int max = 0;
//记录最长回文串的开始位置
int start = 0;
boolean[][] arr = new boolean[A.length()][A.length()];
for(int i=A.length()-1; i>=0; i--) {

for(int j=i; j

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论