题目:
给定一个字符串 s,找到 s 中最长的回文子串。
leetcode:leetcode-cn.com/problems/lo…
解题思路:
- 长度必须大于2,小于的直接返回
- 声明变量start 存储当前找到的最大回文字符串的起始位置,声明变量maxlength 记录字符串长度 ,终止位置则为start+maxlength
- 创建一个function 判断左右两边是否越界,同时判断最左边的字符是否等于最右边的字符。
- 满足function判断条件的,则判断是否需要更新回文字符串最大长度及最大字符串的起始位置并记录起始位置,然后left-- right++ 继续向两边扩散进行判断直到不满足条件为止
- 遍历给定字符串,每个位置调用function两次,第一次从i+1,i-1向两边扩散(bab类型); 第二次从i,i+1向两边扩散(baab类型)
JavaScript代码:
function palindrome(ary) {
if (ary.length < 2) {
return ary
}
let start = 0;
let maxLength = 1;
// 定义一个辅助函数
function expandAroundCenter(left, right) {
// 判断是否越界及左边是否等于右边
while (left >= 0 && right < ary.length && ary[left] === ary[right]) {
// 判断是否需要更新最大回文字符串
if (right - left + 1 > maxLength) {
maxLength = right - left + 1;
// 开始值往左走,用于最后截取答案
start = left;
}
// 继续往左右扩散判断
left--;
right++;
}
}
for (let i = 0; i < ary.length; i++) {
// 这里i+1不需要考虑越界问题,因为函数做了越界判断
expandAroundCenter(i - 1, i + 1);
expandAroundCenter(i, i + 1);
}
// 返回最长回文子字符串
// substring 从第一个参数开始截取到第二个参数
// substr 从第一个参数开始截取 截取几个
return ary.substring(start, start + maxLength)
};
s = "sadsabwcgcwhbj"
console.log(palindrome(s)); // wcgcw