题目描述:
Given a string s
, return the longest palindromic substring in s
.
Example :
Input: s = "babad"
Output: "bab"
Note: "aba" is also a valid answer
Input: s = "cbbd"
Output: "bb"
Input: s = "a"
Output: "a"
Input: s = "ac"
Output: "a"
思路:
这是一道经典的动态规划入门题,最容易想到的方法是O(n^3)复杂度的暴力解法,是三层循环,最外层是从左往右的遍历,代表子字符串头i;中间是每一个从i出发的字符串尾j,从右往左遍历;第三层是判断(i,j)是不是回文串。其实暴力解法往往都是优质算法的起步,所以首先想到暴力解法并不愚蠢,重点是要如何优化他。
暴力解的做法是【由外向内】包围子字符串,那么可不可以换个思路,【由内向外】来找到子字符串呢?观察回文字符串的特点,它必然有一个对称中心,这个对称中心可能是一个字符(比如bab中间的a),可能是两个字符中间的位置(比如bb中间),这个中心对称点可能存在的位置有2n-1个。
如果我们把找字符串头尾的两层循环,变成找字符串中心对