华为机试算法 回文字符串 js

题目描述

【回文字符串】

如果一个字符串正读和反渎都一样(大小写敏感),则称它为一个「回文串」,例如:

leVel是一个「回文串」,因为它的正读和反读都是leVel;同理a也是「回文串」
art不是一个「回文串」,因为它的反读tra与正读不同
Level不是一个「回文串」,因为它的反读leveL与正读不同(因大小写敏感)
给你一个仅包含大小写字母的字符串,请用这些字母构造出一个最长的回文串,若有多个最长的,返回其中字典序最小的回文串。

字符串中的每个位置的字母最多备用一次,也可以不用。

思路:

创建对象map存储键值对,对对象的属性进行字典序的排序,新建空数组存储回文字符,第一遍正序循环map,获取到第一个奇数个数的字符,存储至数组中间;第二遍倒序循环map,对每个属性出现的次数进行对2取商,分别利用数组的unshift和pop存储字符,最后将数组join返回回文字符串

let str = 'abacaZaDcBccc'
function gethuiwen(str){
 let map = {}
 str.split('').forEach(item=>{
  map[item]?map[item]++:map[item]=1
 })
 let sorted_obj = resort(map)
 let newArr = []
 for(let k in sorted_obj){
  if(sorted_obj[k]%2===1){
    newArr.push(k)
    sorted_obj[k]--
    break
  }
 }
 let arr2 = Object.keys(sorted_obj).reverse()
 console.log(arr2)
 for(let i = 0;i<arr2.length;i++){
  let count = Math.floor(sorted_obj[arr2[i]]/2)
  if(count>0){
    for(let j=0;j<count;j++){
      newArr.push(arr2[i])
      newArr.unshift(arr2[i])
    }
  }
 }
 return newArr.join('')
}

function resort(map){
  let arr = Object.keys(map).sort()
  let sorted_obj={}
  arr.forEach(item=>{
    sorted_obj[item]=map[item]
  })
  return sorted_obj
}
console.log(gethuiwen(str))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值