实现思路
首先将字符串拆为单个字符的字符串。然后调用递归dfs函数,深度拼接字符串。
演示:
第一位:第一次s为空字符串,判断s中是否包含'a',没有包含,将a拼接到b上,长度不等,深度遍历,将b='a'传入dfs()中。
第二位:s='a',s中包含a,直接遍历到'b',将'b'拼接到b上,此时b='ab',继续深度遍历,调用dfs()。
第三位:s='ab',s中包含'a'和'b',因此拼接'c'到b上,b='abc',长度等于原字符串的长度,将'abc'添加中resArr数组中。这一层执行完毕,回退到上一层中。
第二位:s='a',此时'b'已经遍历完成,判断s中是否包含'c',不包含,b='ac',继续深度遍历,调用dfs()。
第三位:s='ac',s中不包含'b',因此将将'b'拼接到b上,此时b='acb'。长度与原字符串相等,添加到resArr中。
回退到第二位,第二位也遍历完成,因此最终回退到第一位,该遍历'b'字符,后面的过程与第一位为'a'的情况相同。继续深度遍历即可。
let str = "abc";
let arr = str.split("");
//保存所有字符串的序列
let resArr = [];
dfs("");
//递归函数
function dfs(s) {
for (let j = 0; j < arr.length; j++) {
//s中是否包含某一个字符,
if (s.indexOf(arr[j]) == -1) {
let b = s;
//不修改s,保证本次循环完只有s还是初始传入进来的s,
//如果不包含,在b后面拼接该字符
b += arr[j];
//长度不相等,继续拼接字符
if (b.length != arr.length) {
dfs(b);
} else {
//如果拼接完的字符串b和原字符长度相等,
//则说明已组成一个新的字符序列,添加到结果数组中
resArr.push(b);
}
}
}
}
console.log(resArr);