LeetCode 面试题 08.07. 无重复字符串的排列组合
题目
解题
相似题目:
题目 | 解题 |
---|---|
46. 全排列 | 解题 |
面试题 08.07. 无重复字符串的排列组合 | 解题 |
解题一:从第 n-1 个字符的排列组合开始构造
// javascript
var permutation = function(S) {
const perms = new Array();
if (S.length === 0) { // 基线条件
perms.push("");
return perms;
}
// 获取第一个字符 & 移除第一个字符
const first = S.charAt(0), remainder = S.substr(1);
const words = permutation(remainder);
for (const word of words) {
for (let j = 0; j <= word.length; j++) {
const newStr = insertCharAt(word, first, j);
perms.push(newStr);
}
}
return perms;
};
// 在 word 的 index 位置插入字符 c
const insertCharAt = (word, c, index) => {
const start = word.substr(0, index);
const end = word.substr(index);
return start + c + end;
};
解题二:从 n-1 个字符的所有子序列的排列组合开始构建
// javascript
var permutation = function(S) {
const perms = new Array();
if (S.length === 0) { // 基线条件
perms.push("");
return perms;
}
for (let i = 0; i < S.length; i++) {
// 移除字符 i,继续寻找剩下字符的排列组合
const char = S.charAt(i), before = S.substr(0, i), after = S.substr(i + 1);
const words = permutation(before + after);
// 将字符 i 添加到每个组合
for (const word of words) {
perms.push(char + word);
}
}
return perms;
};
除此以外,还可以把前缀通过调用栈来传递,这样不用每次都把排列组合返回。当递归走到基线条件时,前缀就已经是一个全排列了。
// javascript
var permutation = function(S) {
const result = new Array();
getPerms("", S, result);
return result;
};
const getPerms = (prefix, s, result) => {
if (s.length === 0) result.push(prefix);
for (let i = 0; i < s.length; i++) {
const before = s.substr(0, i);
const after = s.substr(i + 1);
getPerms(s.charAt(i) + prefix, before + after, result);
}
};