「力扣242」 有效的字母异位词

70 阅读1分钟

题目链接

有效的字母异位词

思路

  1. 用一张表存储 s 每个字母的出现次数
  2. 遍历 t 的所有字母,找出字母出现次数:
    • 如果没有该记录,说明这个字母在 t 中的出现次数多于 s。
    • 如果记录为 1, 删去这条记录,因为它被抵消,次数为 0 了。
    • 如果记录大于 1,使它在 map 中的出现次数 -1。
  3. 如果 map 里还有记录,说明抵消完 t 的字母以后,s 还有多的字母,s 的字母数多于 t。
  4. 能走到这里说明没有违规,s 和 t 互为字母异位词。

时间复杂度

O(N*M), 其中 N 是 s 的长度, M 是 t 的长度。 因为真个过程就是遍历了一次 s, 遍历了一次 t。

额外空间复杂度

O(N),N 是 s 的长度。因为用了一张 Map,最坏情况是 s 的所有字母都只出现一次。

TypeScript

function isAnagram(s: string, t: string): boolean { 
    const map = new Map(); 
    for (let i = 0, len = s.length; i < len; i++) { 
        const c = map.get(s[i]); 
        map.set(s[i], c ? c+1 : 1); 
    } 
    
    for (let i = 0, len = t.length; i < len; i++) { 
        const c = map.get(t[i]); 
        if (!c) { 
            return false; 
        } 
        
        if (c === 1) { 
            map.delete(t[i]); 
        } else { 
            map.set(t[i], c-1); 
        } 
    } 
    
    if (map.size > 0) { 
        return false; 
    } 
    
    return true; 
}