543. 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径 可能穿过也可能不穿过根结点。
示例 :
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
思路, 通过递归左子树和右子树计算其深度最大值,左子树和右子树的深度相加=二叉树的直径长度
var diameterOfBinaryTree = function (root) {
if (!root) return 0
function height(node) { //求树高
if (!node) return 0
return 1 + Math.max(height(node.left), height(node.right))
}
let tempH = height(root.left) + height(root.right)
return Math.max(tempH, diameterOfBinaryTree(root.left), diameterOfBinaryTree(root.right))
};
242. 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
思路:这里我先计算字符串中每个字符出现的次数,放入map,然后进行比。注意的细节就是遍历的时候要遍历map长度比较大的
var isAnagram = function (s, t) {
var AnagramObj = function (item) {
let map = new Map();
item.split('').forEach(function (i) {
map.set(i, map.get(i) ? map.get(i) + 1 : 1)
})
return map
}
let S = AnagramObj(s)
let T = AnagramObj(t)
let isST = []
if (S.size > T.size) {
S.forEach(function (value, key) {
S.get(key) === T.get(key) ? isST.push(true) : isST.push(false)
})
} else {
T.forEach(function (value, key) {
S.get(key) === T.get(key) ? isST.push(true) : isST.push(false)
})
}
return isST.every(function (item) { return item === true })
};
409. 最长回文串
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。
在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。
注意: 假设字符串的长度不会超过 1010。
示例 1:
输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
回文字符串: 回文字符串:是一个正读和反读都一样的字符串。
思路: 计算字符串中每个字符出现的次数, 出现次数取余2等于0 出现次数取余2等于1 分为有俩种情况
一种出现次数为1 ,另一种出现次数为大于1 分析完了,看代码
var longestPalindrome = function (s) {
const map = new Map();
s.split('').forEach(function (i) {
map.set(i, map.get(i) ? map.get(i) + 1 : 1);
})
let size = 0
let index = 0
for (let [key, value] of map) {
if (value % 2 === 0) {
size += value
} else if (value % 2 === 1 && value !== 1) {
size += value - 1
index = 1
} else if (value === 1) {
index = 1
}
}
return size + index
};