背景
三年前端,想要跳槽,复习一下面试怎么造火箭吧🚀
技能上,vue 用的多一些,其他的react, webpack, node 等等属于不常用技能,日常拧螺丝是够的,造火箭还要再复习复习
题目
工作日时间少,今天先来一道算法题。
最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
解法好多种,最好最难的马拉车算法可以实现线性复杂度。我这边是为了应对面试,就选择经典的动态规范算法,理解简单。
核心在于 一个回文串,第一个和最后一个字母相同,并且去掉之后还是回文串
P(i, j) = P(i+1, j-1) && (Si == Sj)
初始状态
P(i, i) = true
相邻且相同,不包含在上面那个核心公式里,但是也是回文串,所以完整的伪代码是
P(i, j) = Si != Sj ? false : j - i < 3 ? true : P(i+1, j-1)
通过一个窗口,长度从1 到整个字符串长度,去滚动遍历整个字符串,完整代码如下
var longestPalindrome = function (s) {
if (s.length < 2) return s;
const dp = new Array(s.length).fill(0).map(() => new Array(s.length).fill(false))
let result = {
index: 0,
max: 1
}
for (let Len = 1; Len <= s.length; Len++) {
for (let i = 0; i < s.length; i++) {
let j = Len + i - 1;
if (j >= s.length) {
break;
}
if (s[i] !== s[j]) {
dp[i][j] = false;
} else {
if (Len < 3) {
dp[i][j] = true
} else {
dp[i][j] = dp[i + 1][j - 1]
}
}
if (dp[i][j] && result.max < Len) {
result.max = Len;
result.index = i;
}
}
}
return s.slice(result.index, result.index + result.max);
};
如有疑问,欢迎讨论 😀😀😀