题目描述
给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。
若可行,输出任意可行的结果。若不可行,返回空字符串。
思考
我们可以统计出每个字符出现的次数。然后按照abc..abc....abc...这样的顺序进行排序,那么到最后会出现一种情况。即有且只有一个字符存在剩余情况。或者所有字符都已经排列完毕。
代码如下
var reorganizeString = function(S) {
let oStr = S; // 原始字符串
let newStr = '';
let charArr = [];
for (let i = 0; i < 26; i++) { // 初始化字符串
charArr[i] = {
char: String.fromCharCode(i + 97),
num: 0,
};
}
for (let char of oStr ) { // 统计每个字符出现次数
let index = char.charCodeAt(char) - 97;
charArr[index].num++;
}
// 对字符做一次降序排序
for (let i = 0; i < charArr.length; i++) {
for (let j = i + 1; j < charArr.length; j++) {
if (charArr[i].num < charArr[j].num) {
let tempObj = charArr[i];
charArr[i] = charArr[j];
charArr[j] = tempObj;
}
}
}
// 去除已经清空的字符
splitZero()
getNewStr();
function splitZero() {
for (let i = charArr.length - 1; i >= 0; i--) {
if (charArr[i].num === 0) {
charArr.pop();
} else {
break;
}
}
}
function getNewStr() {
// 当只剩余一个字符或者已经全排列时退出
if ((charArr.length == 1 && charArr[0].num > 1)) {
return;
} else if (charArr.length === 0) {
return;
}
for (let i = 0; i < charArr.length; i++) {
newStr = newStr + charArr[i].char;
charArr[i].num--;
}
splitZero();
getNewStr();
}
if (charArr.length !== 0) {
let charObj = charArr[0];
for (let i = 0; i < newStr.length; i++) {
if (i === newStr.length - 1) {
if (newStr[i] !== charObj.char) {
newStr = newStr + charObj.char;
charObj.num--;
break;
}
} else if (newStr[i] !== charObj.char && newStr[i + 1] !== charObj.char) {
newStr = newStr.slice(0, i + 1) + charObj.char + newStr.slice(i + 1);
charObj.num--;
i++;
if (charObj.num === 0) {
break;
}
}
}
if (charObj.num !== 0) {
newStr = '';
}
}
return newStr
};