最长回文子串
采用中心扩散的方法。
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function (s) {
function fn(s, i) {
let p = i - 1, q = i + 1;
// 单中心扩散
while (p >= 0 && q < s.length) {
if (s[p] != s[q]) break;
else p--, q++;
}
let t1 = s.slice(p + 1, q);
// 可能存在的双中心扩散
if (i + 1 < s.length && s[i] == s[i + 1]) {
p = i - 1, q = i + 2;
while (p >= 0 && q < s.length) {
if (s[p] != s[q]) break;
else p--, q++;
}
}
let t2 = s.slice(p + 1, q);
// 返回本节点可产生的最长回文串
if(t1.length < t2.length) return t2;
else return t1;
}
let max = '';
// 扫描
for (let i = 0; i < s.length; i++) {
let t = fn(s, i);
if (max.length < t.length) max = t;
}
return max;
};
84.柱状图中最大矩形
最初的岗哨写法。最后的用例超时了
var largestRectangleArea = function (heights) {
let min = 1000000, max = -1;;
for (let j = 0; j < heights.length; j++) {
for (let i = j, min = 1000000; i < heights.length; i++) {
min > heights[i] && (min = heights[i]);
heights[i] > max && (max = heights[i]);
if (min * (i - j + 1) > max) max = min * (i - j + 1);
}
}
return max;
};
看题解用了单调栈优化。
let max = 0;
let stack = [];
heights.push(0);
heights.unshift(0);
for (let i = 0; i < heights.length; i++) {
while (stack.length && heights[stack[stack.length - 1]] > heights[i]) {
max = Math.max(max, heights[stack.pop()] * (i - stack[stack.length - 1] - 1));
}
stack.push(i);
}
return max;