文章

04 回文排列

回文排列

题目描述

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。 回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。 回文串不一定是字典当中的单词。

示例 1: 输入:”tactcoa” 输出:true(排列有”tacocat”、”atcocta”,等等)

分析题目: 大白话就是,判断给出的字符串能不能重新组合成回文字符串 回文字符串分为两种:奇数和偶数 若为奇数个,则只有最中间的字符是奇数个,其余字符都必须成双成对是偶数个 若为偶数个,则所有字符都必须成双成对

解题思路:

  1. 遍历字符串,统计所有字符出现次数
  2. 若总长度为奇数个,且仅有一个字符是奇数个,则返回 true
  3. 若总长度为偶数个,且所有字符都是偶数个,则返回 true
  4. 否则返回 false

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
 * @param {string} s
 * @return {boolean}
 */
var canPermutePalindrome = function (s) {
  const countMap = {};
  s.split("").forEach((v, i, arr) => {
    if (countMap[v]) {
      countMap[v]++;
    } else {
      countMap[v] = 1;
    }
  });
  let oddNum = 0;
  let isOddLength = s.length % 2 === 1;
  for (const key in countMap) {
    const number = countMap[key];
    if (number % 2 === 1) oddNum++;
  }
  if ((isOddLength && oddNum === 1) || (!isOddLength && oddNum === 0))
    return true;
  return false;
};
本文由作者按照 CC BY 4.0 进行授权