面试题38. 字符串的排列

 方法
算法思想:dfs+交换。。。。。。。。。。。。。。。。。。
时间复杂度:O(N!)
空间复杂度:O(N2)
边界条件:
补充知识:

class Solution {

    List<String> res=new LinkedList<>();            //结果

       char[] c;

    public String[] permutation(String s) {

       c=s.toCharArray();                                       //

       dfs(0);                                                           //开始dfs

       return res.toArray(new String[res.size()]);  //就这样定义

    }

 

    void dfs(int x){

        if(x==c.length-1)                                          //length??最后一位不看

        {

            res.add(String.valueOf(c));              //String.ValueOf

            return ;

        }

        HashSet<Character> set=new HashSet<>();          //去重?

        for(int i=x;i<c.length;i++){

            if(set.contains(c[i])) continue;                                //去重eg:abb

            set.add(c[i]);                                                            

            swap(i,x);                                                        //交换01 ,02,03

            dfs(x+1);                                                    //下一位

            swap(i,x);                                                   //换回

        }

    }

    void swap(int i,int j){

        char tmp=c[i];

        c[i]=c[j];

        c[j]=tmp;

 

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值