利用dfs求字符串的所有序列

250 阅读2分钟

实现思路

首先将字符串拆为单个字符的字符串。然后调用递归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);