leetcode767-重构字符串

405 阅读1分钟

题目描述

给定一个字符串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
};