单 词 拆 分 + 最大 层内 元素和

72 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

题目:

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。

示例:

输入: s = "leetcode", wordDict = ["leet", "code"] 输出: true 解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"] 输出: false

思路:

定义一个dp[],个数为s.length+1,值全部为布尔类型。

设置dp[0]为true,默认第一个字母可以被拆分,其余初始值全为false,代表不可以被拆分。

"leetcode"能否 break,可以拆分为:
"l"是否是单词表的单词、剩余子串能否 break。
"le"是否是单词表的单词、剩余子串能否 break。
"lee"...以此类推

如果存在中间值j,使得dp[j]可以被拆分出来,且j~i后面的值可以在字典数组中找到,那就存在 单词 可以 拼接成 字符串 的 真理。

代码:

 * @param {string} s
 * @param {string[]} wordDict
 * @return {boolean}
 */
var wordBreak = function (s, wordDict) {
    const n = s.length;
    const set = new Set(wordDict);
    const dp = new Array(n + 1).fill(false);
    dp[0] = true;
    for (let i = 1; i <= n; i++) {
        for (let j = 0; j < i; j++) {
            if (dp[j] && set.has(s.slice(j, i))) {
                dp[i]=true;
                break;
            }
        }
    }
    return dp[n]
};

为什么才 300字。。。好难顶。

题目:最大层内元素和

给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。

请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。

示例:

image.png

输出:2
解释:
第 1 层各元素之和为 1,
第 2 层各元素之和为 7 + 0 = 7,
第 3 层各元素之和为 7 + -8 = -1,
所以我们返回第 2 层的层号,它的层内元素之和最大。

分析:从上到下,从左到右,层序遍历,相加比较后得出最大值,返回该行数。

 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxLevelSum = function(root) {
    let queue = [root], res = 1, max = -Infinity, i = 1
    while(queue.length) {
        let len = queue.length, s = 0
        for (let i = 0; i < len; i++) {
            const x = queue.shift()
            s += x.val
            if (x.left) queue.push(x.left)
            if (x.right)  queue.push(x.right)
        }
        if (s > max) {
            max = s
            res = i
        }
        i++
    }
    return res
};
时间为什么这么慢。