算法练习

119 阅读2分钟

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
    };