LeetCode刷题DAY 2:最长回文子串

原文链接:LeetCode刷题DAY 2:最长回文子串

微信公众号:机器学习养成记


之前刷过回文相关的题(LeetCode刷题DAY 1:回文数判断),本次再来一道跟回文相关的问题——找到最长回文子串。该题目是LeetCode热门100题之一,也是动态规划的经典问题之一,对逻辑能力还是有一定考验。

题目描述

输出一个字符串中的最长回文子串,如针对字符串“abacdd”输出“aba”。要注意空字符串和长度为1的字符串。

解题

思路一:子串遍历

把所有子串列举出来逐一进行判断即可,这个方法最为简单直接,也最容易理解,但复杂度较大。考虑到题目要求是找最长子串,因此本测试用例中优先遍历长度最长的子串,这样在出现回文子串时即可停止,不用继续遍历其他长度更小的子串。

LeetCode刷题DAY 2:最长回文子串_第1张图片

代码中有两个与字符串长度有关的for循环,还有一个判断是否回文的语句也与字符串长度有关,因此时间复杂度为O(N3)。 

思路二:动态规划

动态规划第一步,是要找到可以作为转移的中间状态。这里的中间状态就是子串是否为回文串。

第二步则是确定状态转移。可以发现,一个两端字符相同的字符串,如果他们中间有1个或0个字符,则该字符串为回文串(如“aa”和“aca”,两端字符都是“a”,中间没有其他字符或只有一个“c”,这两个字符串都是回文串),此时可直接判断子串状态。如果一个子串为回文串,则在他两边增加相同的字符后,新字符串仍为回文串(如“aba”左右分别增加“c”成为“cabac”后,仍为回文串),可用此关系进行状态转移。

LeetCode刷题DAY 2:最长回文子串_第2张图片

代码中有两个与字符串长度有关的for循环,时间复杂度为O(N2),用到二维数组记录状态,因此空间复杂度上升为O(N2)。


往期推荐:

百度地图API调用:正逆地理编码

疫情下,你还好吗

图片相似度识别:pHash算法

你可能感兴趣的:(LeetCode刷题DAY 2:最长回文子串)