最长回文子串,等题目

最长回文子串
采用中心扩散的方法。

/**
 * @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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值