【发布时间】:2019-09-05 20:37:51
【问题描述】:
我正在尝试生成字符串的所有大写排列。
例如:
capitalPermutations(word) - 给定一串字母,返回所有 该单词的大小写字母的可能组合。
示例:'abc'
输出:['abc' 'Abc' 'aBc' 'ABc' 'abC' 'AbC' 'aBC' 'ABC']
以迭代和递归的方式实现这一点。
这是我的尝试:
function capitalPermutations(word) {
const res = new Set();
// Push the actual word first.
res.add(word);
helper(word, res, '');
return res;
function helper(word, res, str='') {
if(str.length === word.length) return;
const len = word.length;
res.add(word);
// Capitalization
for(let i=0; i< word.length; i++) {
const substr = word.substring(0, i+1); // a, ab, abc
str += substr; // str === "ABC" | len = 3
const upper = str.toUpperCase(); // A, AB, ABC
const remaining = `${upper}${word.substring(i, len)}`; // Abc , ABc,
helper(remaining, res, str);
}
}
}
var testWord1 = "abc"
console.log(capitalPermutations(testWord1))
问题: 它进入无限递归。即使我有一个破碎的条件。如果有人能纠正我的错误之处,我将不胜感激。
【问题讨论】:
-
@kmgt 这没有什么问题,这就是递归的真正好处——迭代不容易实现。
-
作业令人困惑。这实际上与排列无关,排列是关于排序的。
-
"如果有人能纠正我的错误之处,我将不胜感激" - 你能试着解释一下你要去哪里吗?我完全不明白你的方法。为什么要遍历单词长度并从中获取所有前缀?你为什么要
str += substr?在您的基本情况下,您的意思是与原始的words 长度(传递给capitalPermutations的长度)或递归调用中传递的word进行比较?为什么在每个递归步骤中都将word添加到result,而不是最后一次? -
@Bergi 感谢您的评论。我使用
str来跟踪我正在处理的字符串数量。我知道我的代码令人困惑(只是想学习!)感谢您的帮助和所有 cmets。在我的基本情况下,我希望将我的原始字长(而不是通过的字长)进行比较我的错! -
不会生成所有排列生成字符串,例如
cab、bac等?这个任务不只是关于生成所有不同的套管变体吗?
标签: javascript recursion