这道题可以从人的思维方式入手。如果是人来解决这个问题,会先找到最内层的[],然后decode之间的string。重复这个过程直到所有的[]都被decode。

var decodeString = function(s) {
    let len = s.length;
    if (len === 0) {
        return '';
    }
    while (true) {
        // find first ']' and corresponding matched '['
        let i = 0; 
        len = s.length;
        while (i < len && s[i] !== ']') i++;
        if (i === len) {
            return s;
        }
        let j = i-1;
        while (j >= 0 && s[j] !== '[') j--;

        const word = s.substring(j+1, i);
        let k = j-1;
        while (k >= 0 && !isNaN(s[k])) k--;
        const number = parseInt(s.substring(k+1, j));
        let str = '';
        for (let ii = 0; ii < number; ii++) {
            str += word;
        }
        const arr = s.split('');
        arr.splice(k+1, i-k, str);
        s = arr.join('');
        if (!encoded(s)) {
            break;
        }
    }
    return s;

};

function encoded(s) {
    for (let i = 0; i < s.length; i++) {
        if (s[i] === '[' || s[i] === ']') {
            return true;
        }
    }
    return false;
}

论坛里有人用dfs来解决这个问题,关键是把pos以引用方式传入,这样scan一遍就可以decode整个string。

var decodeString = function(s) {
    let len = s.length;
    if (len === 0) {
        return '';
    }

    const pos = [0];
    return helper(s, pos);    
};

function helper(str, pos) {
    const len = str.length;
    if (pos === len) {
        return '';
    }

    let num = 0;
    let res = '';
    for (;pos[0] < len; pos[0]++) {
        const curr = str[pos[0]];
        if (!isNaN(curr)) {
            num = num*10 + parseInt(str[pos[0]]);
        } else if (curr === '[') {
            pos[0]++;
            word = helper(str, pos);
            for (let i = 0; i < num; i++) {
                res += word;
            }
            num = 0;
        } else if (curr === ']') {
            return res;
        } else {
            res += curr;
        }
    }
    return res;
}

results matching ""

    No results matching ""