LeetCode - 409 - 最长回文串(longest-palindrome)

Create by jsliang on 2019-07-25 14:47:112019-07-25 15:33:25

一 目录

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

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | |  3.1 解法 - Map | |  3.2 解法 - Set |

二 前言

  • 难度:简单

  • 涉及知识:哈希表

  • 题目地址:https://leetcode-cn.com/problems/longest-palindrome/

  • 题目内容

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。	
在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。	
注意:	
假设字符串的长度不会超过 1010。	
示例 1:	
输入:	
"abccccdd"	
输出:	
7	
解释:	
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

三 解题

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

3.1 解法 - Map

  • 解题代码

var longestPalindrome = function(s) {	
  s = s.split('');	
  let map = new Map();	
  let result = 0;	
  for (let i = 0; i < s.length; i++) {	
    if (map.get(s[i]) === 1) {	
      map.delete(s[i]);	
      result += 2;	
    } else {	
      map.set(s[i], 1);	
    }	
  }	
  return map.size ? result + 1 : result;	
};
  • 执行测试

  1. s: abccccdd

  2. return

7
  • LeetCode Submit

✔ Accepted	
  ✔ 95/95 cases passed (88 ms)	
  ✔ Your runtime beats 86.93 % of javascript submissions	
  ✔ Your memory usage beats 37.14 % of javascript submissions (35.6 MB)
  • 知识点

  1. split(): split() 方法使用指定的分隔符字符串将一个 String 对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。 split() 详细介绍

  2. Map:保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。 Map 详细介绍

  • 解题思路

首先,我们解析下怎么的字符串能构成回文串:

  1. 这个字母有两个,这样可以左右对称,例如: abba

  2. 这个字母可能有一个尾巴,作为中间对称点,例如: abcba

那么,我们将字符串切换成数组,通过一个 Map 来记录字母出现的情况。

  1. 遍历数组。

  2. 如果 Map 中不包含数组出现的元素,那么我们将其出现的次数记为 1。

  3. 如果 Map 中包含数组出现的元素,那么它的次数肯定是 1,所以回文串的长度 result 可以 + 2,同时清空掉这个元素。

var longestPalindrome = function(s) {	
  s = s.split('');	
  let map = new Map();	
  let result = 0;	
  for (let i = 0; i < s.length; i++) {	
    if (map.get(s[i]) === 1) {	
      map.delete(s[i]);	
      result += 2;	
    } else {	
      map.set(s[i], 1);	
    }	
  }	
  return map.size ? result + 1 : result;	
};

最后,我们判断剩下的 Map 是否还有元素,如果存在,说明可以带一个尾巴,即 result+1,如果不存在,则直接返回 result

3.2 解法 - Set

  • 解题代码

var longestPalindrome = function (s) {	
  let result = 0;	
  let set = new Set();	
  for (const str of s) {	
    if (set.has(str)) {	
      set.delete(str);	
      result += 2;	
    } else {	
      set.add(str);	
    }	
  }	
  return result + (set.size ? 1 : 0);	
};
  • 执行测试

  1. s: abccccdd

  2. return

7
  • LeetCode Submit

✔ Accepted	
  ✔ 95/95 cases passed (76 ms)	
  ✔ Your runtime beats 94.77 % of javascript submissions	
  ✔ Your memory usage beats 21.43 % of javascript submissions (36.1 MB)
  • 知识点

  1. Set: Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。 Set 详细介绍

  • 解题思路

你能通过 Map 实现的,也可能通过 Set 实现,唯有尝试了,才能获得乐趣。


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

640?wx_fmt=jpeg

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

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

640?wx_fmt=png

jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值