「力扣266」 回文排列

150 阅读1分钟

题目链接

回文排列

思路

遍历 s,出现 2 次的字母都抵消掉,最后剩余 1 个或 0 个字母就达标,否则不达标。

步骤

  1. 准备一张哈希表,key为s中的字母,value为剩余个数。
  2. 遍历s, 每个字母都在 map 中查询一次:
  • 如果没有在 map 中,记录剩余个数1。
  • 如果剩余个数为 1,抵消这个字母,具体做法是在 map 中删除这条记录。通过这样的流程,s 中的字母,要么在 map 中 value 为 1,要么压根没有这条记录。
  • 遍历完成以后,检查 map 的记录数,如果只有 1 条记录 (抵消到最后只剩一个字母),或者 1 条记录也没有 (全部抵消完),那么 s 就可以通过重新排列成为一个回文字符串。

复杂度

假设 N 是 s 的长度。

时间复杂度

O(N), 因为只需要遍历 s 一次。

空间复杂度

O(N), 需要一张哈希表,最坏情况是 s 的每个字母各不相同, 需要存储 N 条记录。

代码

TypeScript

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