题目链接
思路
遍历 s,出现 2 次的字母都抵消掉,最后剩余 1 个或 0 个字母就达标,否则不达标。
步骤
- 准备一张哈希表,key为s中的字母,value为剩余个数。
- 遍历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;
}
};