携手创作,共同成长!这是我参与「掘金日新计划 · 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 层,依此类推。
请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。
示例:
输出: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
};