我正在做leetcode问题Letter Tile Possibilities。您可以在其中打印出给定字符串的每个可能序列。
我在下面有一个可行的解决方案。但是,作为后续,我想尝试显示所有序列,但是遇到了问题。给定字符串“ AAB”,它将打印正确数量的序列,但重复几个序列,如下所示:
注释: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#解决方案:
但是无法确定导致序列正确打印的解决方案之间的差异。
如何为该问题打印出每个字符串序列?
答案 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;
}