题目:
给定一个字符串 S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
示例:
- 示例 1
入: S = "aab"
输出: "aba"
- 示例 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 栏目
欢迎关注留言