题目
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
var longestPalindrome = function(s) {
if (s.length === 1) return s;
var res = '';
var time = s.length;
while (time--) {
let nowRes = '';
var nowMidIndex = s.length - time - 1;
var nowRepeatMidIndex = nowMidIndex;
while (s[nowMidIndex] === s[++nowRepeatMidIndex]) {
;
}
nowRepeatMidIndex--;
nowRes = s.slice(nowMidIndex, nowRepeatMidIndex + 1);
var extraCount = 1;
while (s[nowMidIndex - extraCount] && s[nowRepeatMidIndex + extraCount] && s[nowMidIndex - extraCount] === s[nowRepeatMidIndex + extraCount]) {
nowRes = `${s[nowMidIndex - extraCount]}${nowRes}${s[nowMidIndex - extraCount]}`;
extraCount++;
}
if (res.length < nowRes.length) {
res = nowRes;
}
}
return res;
};
刚做了第70题,想多练习一下动态规划的题目,这道题是题号最小的动态规划
这道题一开始我没有想出来,看了题解才有思路。
思路:
- 当一个子字符串是一个回文字符串,那么在该字符串头尾添加一个相同的字符,新字符串依旧是回文字符串;
- 我们把子字符串分成3部分:中间重复字符串部分,头部和尾部,'abaaaba',该字符串中间重复字符串部分是'aaa',头部是'ab',尾部是'ba';
- 遍历输入字符串的所有字符,先根据当前字符,判断后续字符是否一致,如果一致则不断拓展中间字符串部分,直至遇到与当前字符不一样的字符;
- 得到了中间字符串,此时也是一个回文字符串,就可以开始拓展头部和尾部,如果当前回文字符串的两侧都有字符并且相等,那么当前回文字符串拓展向前向后拓展一位。如果有一侧不存在字符了,或者两侧存在的字符不一致,那么当前字符的最长回文字符串就到此结束了;
- 遍历所有的字符得到对应的最长回文字符串,其中最长的回文字符串就是结果。