题目描述
【回文字符串】
如果一个字符串正读和反渎都一样(大小写敏感),则称它为一个「回文串」,例如:
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))