【一天一大 lee】重构字符串 (难度:中等) - Day20201130

20201130

题目:

给定一个字符串 S,检查是否能重新排布其中的字母,使得两相邻的字符不同。

若可行,输出任意可行的结果。若不可行,返回空字符串。

示例:

  1. 示例 1
入: S = "aab"
输出: "aba"
  1. 示例 2
输入: S = "aaab"
输出: ""

注意:

  • S 只包含小写字母并且长度在[1, 500]区间内。

抛砖引玉

将所有字符规制到哈希表中,且记录每个字符出现的次数,然后当字符单个字符的间隔填充。

注意当重复次数最多的字符,重复数量大于长度的一边则不能满足相同元素不相邻的要求。

抛砖引玉

/**
 * @param {string} S
 * @return {string}
 */
var reorganizeString = function(S) {
    let len = S.length,
        map = new Map(),
        max = 0,
        maxStr = '',
        _result = []
    for (let i = 0; i < len; i++) {
        const num = map.get(S[i]) || 0
        map.set(S[i], num + 1)
        if (max < num + 1) {
            max = num + 1
            maxStr = S[i]
        }
    }
    if (max > Math.ceil(len / 2)) return ''
    // 根据字符出现的次数排序
    let list = [...map].sort((a, b) => b[1] - a[1]),
        index = 0,
        i = 0
    // 间隔填充,一中字符填充完成再填充下一种,先填充偶数位,
    while (index < S.length) {
        if (list[i][1] > 0) {
            _result[index] = list[i][0]
            index += 2
            list[i][1]--
        } else {
            i++
        }
    }
    // 再填充奇数位
    index = 1
    while (index < S.length) {
        if (list[i][1] > 0) {
            _result[index] = list[i][0]
            index += 2
            list[i][1]--
        } else {
            i++
        }
    }
    return _result.join('')
}

博客: 前端小书童

每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目
欢迎关注留言

公众号:前端小书童

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值