113. 路径总和 II
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
/*
* function TreeNode(x) {
* this.val = x;
* this.left = null;
* this.right = null;
* }
*/
/**
*
* @param root TreeNode类
* @param sum int整型
* @return int整型二维数组
*/
function pathSum( root , sum ) {
// write code here
let res = [];
const dfs = (root,ctn,path) => {
// 遍历完成,把path大批放到res中去
if (!root.left && !root.right && ctn === 0) {
res.push([...path])
return
}
// 没有左右节点
if (!root.left && !root.right) {
return
}
if (root.left) {
path.push(root.left.val) // 先将值push
dfs(root.left,ctn - root.left.val,path) // 遍历这个节点是否由左右子节点
path.pop(); // 回溯,某个节点的左右子节点都遍历到
}
if (root.right) {
path.push(root.right.val)
dfs(root.right,ctn - root.right.val,path)
path.pop();
}
}
if (root === null) return []
dfs(root,sum - root.val,[root.val])
return res
}
module.exports = {
pathSum : pathSum
};
5. 最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
/**
* @param {string} s
* @return {string}
*/
var longestPalindrome = function(s) {
if(!s || s.length < 2){ // 边界
return s;
}
let len = s.length;
let start = 0;
let end = 0;
// 帮助函数,比对左右两边的值是否相等
const helpFn = (left,right) => {
while(left >= 0 && right <= len && s[left] == s[right]) {
left--;
right++;
}
return right - left -1;
}
// 遍历字符串,因为会存在奇偶数的字符串结果,所以分两种情况
for (let i = 0;i < len;i++) {
let len1 = helpFn(i,i); // 奇数
let len2 = helpFn(i,i+1);// 偶数
let maxlen = Math.max(len1,len2); // 取最大
// 更新最大长度
if (maxlen > end - start) {
start = i - ((maxlen - 1) >> 1);
end = i + (maxlen >> 1);
}
}
// 切割字符串
return s.substring(start,end + 1)
};