[前端]_一起刷leetcode 409. 最长回文串

297 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

题目:

409. 最长回文串

难度简单349收藏分享切换为英文接收动态反馈

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。

注意:
假设字符串的长度不会超过 1010。

示例 1:

输入:
"abccccdd"

输出:
7

解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

思路:

  1. 回文数的意思是字符串翻转后等于字符串本身,意味着除了最中间的元素,其他元素都至少出现两次
  2. 创建map对象,记录字符串中每个元素出现的次数,每出现两次结果+2
  3. 判断所有元素是否已经用完,如果有剩数组中间可以存放一个只出现过一次的

优化:

  1. 在遍历时候进行判断,如果存在了就清空,结果加2,这样子待会儿不用对map进行遍历
  2. 当所有出现过两次的统计完直接拿长度跟原字符串作比较,小于就直接给答案+1,不用对map进行遍历
  3. 完成以上两点会发现map的统计没意义了,直接改成set即可

实现:

/**
* @param {string} s
* @return {number}
*/
var longestPalindrome = function(s) {
  const n = s.length;
  // 记录结果是否出现过, 这里用set就可以了没必要用map
  let set = new Set();
  let result = 0;

  for (let i = 0; i < n; i++) {
      // 每出现两次,结果+2, 出现1次只记录不加
      if (set.has(s[i])) {
          set.delete(s[i]);
          result += 2;
      } else {
          set.add(s[i]);
      }
  }

  // 回文数中间的一个数字可以是只出现过一次的,判断还有没有剩余元素
  return result < n ? result + 1 : result;
};

总结:

这道题目相对来讲比较简单,顺带提一下es6中Map和Set的区别吧。面试题中挺常见的。Set一般用于统计元素是否出现过,Map一般用来统计元素出现过的次数,两者在新增元素时候也有区别。Set通过Set.add(XX)去新增元素,Map通过Map.set(XX, '')去新增元素,用到set和map都是用空间换时间,提升代码执行的速度。

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。