【leetcode】242. 有效的字母异位词

47 阅读1分钟

leetcode-242.png

这一题是判断字母异位词,开始就想到了排序来判断是否是异位词,但是这里的复杂度比较高,因为排序需要nlogn的时间来处理
使用map来排序也是一个不错的选择,用空间换时间,这里的空间比较值得去换,毕竟也就26个字母,再多也多不到哪里去
只不过当字符串很长时,排序的时间复杂度就变大了,所以这里选择用map还是比较划算的

排序

#### 啰嗦版本
var isAnagram = function (s, t) {
    let ss = s.split('')
    let ts = t.split('')
    var sortChar = function (a, b) {
        return a.charCodeAt(0) - b.charCodeAt(0)
    }
    ss.sort((a, b) => sortChar(a, b))
    ts.sort((a, b) => sortChar(a, b))
    return ss.join('') === ts.join('')
};

简化版本

var isAnagram = function (s, t) {
    if (s.length !== t.length) return false
    var sortStr = (str) => str.split('').sort().join('')
    return sortStr(s) === sortStr(t)
};

map统计

map啰嗦版

var isAnagram = function (s, t) {
    if (s.length !== t.length) return false
    let map = new Map()
    for (let i = 0; i < s.length; ++i) {
        if (map.has(s[i])) {
            map.set(s[i], map.get(s[i]) + 1)
        } else {
            map.set(s[i], 1)
        }
        if (map.has(t[i])) {
            map.set(t[i], map.get(t[i]) - 1)
        } else {
            map.set(t[i], -1)
        }
    }
    for (let [k, v] of map) {
        if (v !== 0) return false
    }
    return true
};

map精简版

var isAnagram = function (s, t) {
    if (s.length !== t.length) return false
    let map = new Map()
    for (let i = 0; i < s.length; ++i) {
        map.set(s[i], (map.get(s[i]) || 0) + 1)
        map.set(t[i], (map.get(t[i]) || 0) - 1)
    }
    for (let v of map.values()) {
        if (v !== 0) return false
    }
    return true
};

数组统计

两个数组

var isAnagram = function (s, t) {
    if (s.length !== t.length) return false;
    let arr1 = new Array(26).fill(0);
    let arr2 = new Array(26).fill(0);
    let a = "a".charCodeAt(0);
    for (let i = 0; i < s.length; ++i) {
        arr1[s[i].charCodeAt(0) - a]++;
        arr2[t[i].charCodeAt(0) - a]++;
    }
    console.log(arr1);
    console.log(arr2);
    for (let i = 0; i < 26; ++i) {
        if (arr1[i] !== arr2[i]) return false;
    }
    return true;
};

一个数组

var isAnagram = function (s, t) {
    if (s.length !== t.length) return false
    let cnt = new Array(26).fill(0)
    let aCode = 'a'.charCodeAt(0)
    for (let i = 0; i < s.length; ++i) {
        cnt[s[i].charCodeAt(0) - aCode]++
        cnt[t[i].charCodeAt(0) - aCode]--
    }
    return cnt.every(v => v === 0)
};