显示所有字母平铺可能性

时间:2019-10-17 17:27:42

标签: javascript c# algorithm

我正在做leetcode问题Letter Tile Possibilities。您可以在其中打印出给定字符串的每个可能序列。

我在下面有一个可行的解决方案。但是,作为后续,我想尝试显示所有序列,但是遇到了问题。给定字符串“ AAB”,它将打印正确数量的序列,但重复几个序列,如下所示:

enter image description here

注释:B是重复序列,序列ABA从未出现。

var numTilePossibilities = function (tiles) {
    let map = getTileMap(tiles);
    return helper(map, "");
};

function helper(map, currString) {
    let sum = 0;
    for (let character in map) {
        if (map[character] !== 0) {
            sum++;
            currString += character;
            map[character] = map[character] - 1;
            sum += helper(map, currString);
            map[character] = map[character] + 1;
            console.log('completed string: ', currString);
            currString = '';
        }
    }
    return sum;
}

我找到了我编辑过的其他解决方案,以打印出所有序列,并且打印正确,例如以下c#解决方案: enter image description here enter image description here

但是无法确定导致序列正确打印的解决方案之间的差异。

如何为该问题打印出每个字符串序列?

1 个答案:

答案 0 :(得分:1)

您的问题在于打印后currString的修改方式。如果要撤消character的附加,则应删除该字符而不是将字符串设置为空字符串:

currString = currString.substring(0, currString.length - 1);

也许最好保留currString并仅为内部作用域创建一个新字符串:

function helper(map, currString) {
    let sum = 0;
    for (let character in map) {
        if (map[character] !== 0) {
            let newString = currString + character;            
            sum++;

            map[character] = map[character] - 1;
            sum += helper(map, newString);
            map[character] = map[character] + 1;

            console.log('completed string: ', newString);
        }
    }

    return sum;
}