题目描述:
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
样例:
1 | Input: "babad" |
1 | Input: "cbbd" |
就给泥萌看一个非常智障的蚊子,给泥萌看看蚊子的心路历程,嘤嘤嘤~
就为什么这么多爆空间呢?
当然是蚊子不想用 DP,然后就开始莽,就直接遍历每一次就使用 string 的字符串截取函数 substr(),来生成新的 string,然后又使用 reverse() 函数来反转字符串,最后来判断俩 string 是否相同,然后就爆空间辣!
思路:
正解是 DP,就 $dp[i][j]$,表示 i 到 j 之间的字符串是否为回文串,那么怎么判断 $dp[i][j]$ 是回文串呢?
首先我们要想到如果 $dp[i][j]$ 是回文串,那么 $dp[i + 1][j - 1]$ 一定是回文串,并且当 $s[i] == s[j]$ 的时候,$dp[i][j]$ 所表示的 i 到 j 之间的字符串就为回文串了,这样我们就有了:
$dp[i][j] = dp[i + 1][j - 1] \& (s[i] == s[j]) $
这一个 dp 状态方程;
那么接下来就是,每一个单个字符,肯定也是回文串,所以就有 $dp[i][i] = 1$,这样也就有了初始状态;
但是此时我们发现写出来的代码,第二个样例 “cbbd”,不能通过,这是为什么呢?
因为当 len = 2 的时候,它们中间没有 $dp[i + 1][j - 1]$,所以我们此时就要判断一下
最后的代码就如下所示:
1 | class Solution { |
Runtime:264ms Memory:187.2MB