给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
这题不看思路真做不出来。。。
- 理解题意
- 题目给定一个字符串
- 需要我们找到这个字符串中的最长回文串
- 回文串:正着读和反着读都一样的字符串
- 整体思路
- 我根据回文串的一个核心思想来解题:从中心点往两边扩散,来寻找回文串,这种方向相当于穷举每一个点为中心点
- 如果回文串是奇数时,比如 "bab" ,它的中心点就只有一个 "a",所以从 "a" 开始向两边扩散
- 如果回文串是偶数时,比如 "baab",它的中心点有两个 "aa",所以从 "aa" 开始向两边扩散
- 编写一个辅助函数来寻找回文串,当中心点确定了之后调用辅助函数,直接返回找到的回文串
- 将每次找到的回文串与之前的做对比,谁长就留谁
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
let str = ""
for(let i=0; i<s.length; i++){//abba
//穷举中心点
let subString1 = findHuiWen(s,i,i)
let subString2 = findHuiWen(s,i,i+1)
str = str.length > subString1.length ? str : subString1
str = str.length > subString2.length ? str : subString2
}
return str
};
function findHuiWen(s, left, right){
while(left >=0 && right < s.length) {
if(s.charAt(left) == s.charAt(right)) {
left--
right++
} else {
break
}
}//执行结束left和right都回退一个,但是substring方法左闭右开[,),因此right保持不变
return s.substring(left+1,right)
}
用到的知识点:
String.prototype.charAt()
charAt() 方法从一个字符串中返回指定的字符。
str.charAt(index)
String.prototype.substring()
substring()
方法返回一个字符串在开始索引到结束索引之间的一个子集,或从开始索引直到字符串的末尾的一个子集。
str.substring(indexStart[, indexEnd])