字符串的排列

来源:互联网 发布:无间道为什么经典 知乎 编辑:程序博客网 时间:2024/05/29 17:30

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 

Idea

看到别人用的好的方法放到这里,共勉

Code

1.回溯法

import java.util.*;public class Solution {    public ArrayList<String> Permutation(String str) {        ArrayList<String> res = new ArrayList<String>();        if(str==null||str.length()==0){            return res;        }        HashSet<String> set=new HashSet<String>();        fun(set,str.toCharArray(),0);        res.addAll(set);        Collections.sort(res);        return res;    }    private static void fun(HashSet<String> set,char[] str,int k){        if(k==str.length){            set.add(new String(str));            return;        }        for(int i=k;i<str.length;i++){            swap(str,i,k);            fun(set,str,k+1);            swap(str,i,k);        }    }    private static void swap(char[] str,int i,int j){        char tmp=str[i];        str[i]=str[j];        str[j]=tmp;    }}


2.dfs

import java.util.*; public class Solution {    private char[] seqs;    private Integer[] book;    private HashSet<String> result=new HashSet<String>();    public ArrayList<String> Permutation(String str){        ArrayList<String> arrange=new ArrayList<String>();        if(str==null||str.isEmpty()) return arrange;        char[] strs=str.toCharArray();        seqs=new char[strs.length];        book=new Integer[strs.length];        for(int i=0;i<book.length;i++){            book[i]=0;        }        dfs(strs,0);        arrange.addAll(result);        Collections.sort(arrange);        return arrange;    }     private void dfs(char[] arrs,int step){        //走完所有可能 记录排列        if(arrs.length==step){            String str="";            for (int i=0;i<seqs.length;i++){                str+=seqs[i];            }            result.add(str);            return; //返回上一步        }        //遍历整个序列,尝试每一种可能        for (int i=0; i<arrs.length;i++){            //是否走过            if(book[i]==0){                seqs[step]=arrs[i];                book[i]=1;                //下一步                dfs(arrs,step+1);                //走完最后一步 后退一步                book[i]=0;            }        }    }}



0 0