vlambda博客
学习文章列表

​【程序员面试金典】【字符串】面试题 01.04 - 回文排列


一 目录

不折腾的前端,和咸鱼有什么区别

目录
一 目录
二 题目
三 解题思路
四 统计分析
五 解题套路

二 题目

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。

回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。

回文串不一定是字典当中的单词。

示例1:

输入:"tactcoa"
输出:true(排列有"tacocat"、"atcocta",等等)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-permutation-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
 * @param {string} s
 * @return {boolean}
 */

var canPermutePalindrome = function(s{

};

根据上面的已知函数,小伙伴们可以先尝试破解本题,确定了自己的答案后再看下面代码。

三 解题思路

两种解法:

  1. Map
  2. Array

07:07 解法 1:Map 记忆

const canPermutePalindrome = (s) => {
  const map = new Map();
  for (let i = 0; i < s.length; i++) {
    if (map.get(s[i])) {
      map.set(s[i], map.get(s[i]) + 1);
    } else {
      map.set(s[i], 1);
    }
  }
  let flag = false;
  for (let i of map) {
    if (i[1] % 2 !== 0 && flag) {
      return false;
    } else if (i[1] % 2 !== 0 && !flag) {
      flag = true;
    }
  }
  return true;
};

10:14 解法 2:数组

/**
 * @param {string} s
 * @return {boolean}
 */

const canPermutePalindrome = (s) => {
  const newS = s.split('').sort();
  const result = [];
  for (let i = 0; i < newS.length; i++) {
    if (result[result.length - 1] === newS[i]) {
      result.pop();
    } else {
      result.push(newS[i]);
    }
  }
  return result.length < 2;
};

回顾了下,好像 Map 操作可以优化一下:

const canPermutePalindrome = (s) => {
  const map = new Map();
  for (let i = 0; i < s.length; i++) {
    if (map.has(s[i])) {
      map.delete(s[i]);
    } else {
      map.set(s[i], 1);
    }
  }
  return map.size < 2;
};

那么就到这里吧~

四 统计分析

本题不需要统计分析

五 套路分析

本题暂未发现任何套路,如果有但是 jsliang 后面发现了的话,会在 GitHub 进行补充。

如果小伙伴有更好的思路想法,或者没看懂其中某种解法,欢迎评论留言或者私聊 jsliang~


不折腾的前端,和咸鱼有什么区别!

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

浪子神剑 会每天更新面试题,以面试题为驱动来带动大家学习,坚持每天学习与思考,每天进步一点!


jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。