【剑指offer】字符串的排列

题目描述:

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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;
    }
    
   
    
    
  
    
   
}
点赞