[JS]字符串的排列

字符串的排列

http://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7

先用递归方法列出所有组合的可能。
递归逻辑:

  1. 在当前str长度为n的情况下,提取出str[0]作为我们这一轮要插入的数。

  2. 此时我们只要知道剩下n-1的排列组合,每一种组合从[0,length]依次插入str[0]得到新的排列组合。

    function calculate(arr){
     if(arr.length==1) return arr
     let res = calculate(arr.slice(1))//得到n-1所有的排列组合
     let final_res =[]
     for(let item of res){//挨个遍历每种组合
         for(let i = 0;i<=item.length;i++){//所有位置依次插入,形成新的组合
             final_res.push(item.slice(0,i)+arr[0]+item.slice(i,))
         }
     }

    在这一步之后,我们的排列组合会出现冲的情况,需要查重。
    在这里直接使用map,删掉重复。

     let map = new Map()
     for(let i=0;i<final_res.length;){
         if(!map.has(final_res[i])) {
             map.set(final_res[i],'');
             i++;
         }
         else {final_res.splice(i,1)}
    
     }
     return final_res.sort()

完整代码

function Permutation(str)
{
    // write code here

    let res = calculate(str)
    return res
}

function calculate(arr){
    if(arr.length==1) return arr
    let res = calculate(arr.slice(1))
    let final_res =[]
    for(let item of res){
        for(let i = 0;i<=item.length;i++){
            final_res.push(item.slice(0,i)+arr[0]+item.slice(i,))
        }
    }
    let map = new Map()
    for(let i=0;i<final_res.length;){
        if(!map.has(final_res[i])) {
            map.set(final_res[i],'');
            i++;
        }
        else {final_res.splice(i,1)}

    }


    return final_res.sort()
}
全部评论

相关推荐

暴杀流调参工作者:春招又试了一些岗位,现在投递很有意思,不仅要精心准备简历,投递官网还得把自己写的东西一条一条复制上去,阿里更是各个bu都有自己的官网,重复操作无数次,投完简历卡完学历了,又该写性格测评、能力测评,写完了又要写专业笔试,最近还有些公司搞了AI辅助编程笔试,有些还有AI面试,对着机器人话也听不明白录屏硬说,终于到了人工面试又要一二三四面,小组成员面主管面部门主管面hr面,次次都没出错机会,稍有不慎就是挂。 卡学历卡项目卡论文卡实习什么都卡,没有不卡的😂
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务