题解 | #全排列#
全排列
https://www.nowcoder.com/practice/b3ac35e1569e4601b6d3957dd337e70b
const _permute = string => { // 补全代码 let result = [] if(string.length==1){ return [string] } for(let x of string){ let others = string.split('').filter(item=>item!==x) let stringLefted = others.join('') let stringLeftedArr = _permute(stringLefted) stringLeftedArr.map(item=>{ result.push(x+item) }) } return result }
全排列,可以看作取出一个数,剩余的数继续排列,当字符串中每个字符都尝试过取出来,即完成了排列。因此我们需要用到递归,因为他是层层嵌套的,比如三个字符,我取出一个a,剩余bc需要继续排列,而_permute函数本身就是排列字符串的,因此我们需要执行以下_permute('bc')得到排列结果,_permute('bc')当我们取b的时候,就执行以下_permute('c'),到这里我们就没办法执行下去了,因为_permute('')是没有意义的,会陷入死循环,因此当_permute('c')的时候我们要跳出循环,整个流程如下:
- abc取a,求_permute('bc')
- bc取b,求_permute('c')
- _permute('c')返回 [c]
- bc取c,求_permute('b')
- _permute('c')返回 [b]
- 求_permute('bc') 返回【bc,cb】
- 拼接a和【bc,cb】,保存到result中
- abc取b,求_permute('bc')
- 。。。。