【剑指offer】字符串的排列

来源:互联网 发布:txt转mobi for mac 编辑:程序博客网 时间:2024/05/16 04:41

题目描述:

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

输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。


思路:全排列问题

例如:输入字符串abc,先固定a,求bc的全排列;再把a和b交换位置,固定b,求ac的全排列;再把a和c交换位置,固定c,求ba的全排列

每个子问题的全排列都可以递归去求,直到只有一个元素为止


注意一:按字典顺序排序

注意二:去除重复

import java.util.*;public class Solution {    public ArrayList<String> Permutation(String str) {        ArrayList<String> result = new ArrayList();        if(str ==null)            {            return result;        }        //字符串转换为字符串数组        char[] str_arr = str.toCharArray();        permu(str_arr,result,0,str_arr.length-1);        //按字典顺序打印输出        Collections.sort(result);                return result;    }        public void permu(char[] str,ArrayList<String> result,int from,int to)        {        if(from==to)            {            String complete = new String(str);            result.add(complete);        }        else{            for(int i=from;i<=to;i++)                {                //去除重复                if((i!=from)&&(str[i]==str[from]))                    {                    continue;                }                swap(str,i,from);                permu(str,result,from+1,to);                swap(str,i,from);            }        }            }        //交换顺序    public void swap(char[] str,int begin,int end)        {        char temp = str[begin];        str[begin]=str[end];        str[end]=temp;    }                        }


0 0
原创粉丝点击