剑指Offer28:字符串的排列(Java)

总结 :

  • 主要考察全排列算法的实现

    一个数组把里面的每一个数轮流执行这个过程:把该值放在第一位,其余各个数做全排列;for(int j=i;j<arr.length;j++)
  • 用选择排序算法实现字符串字典排序(可不用自己写代码,直接用Collections.sort())

    字符串的按字典顺序比较大小使用compareTo()方法

题目描述:

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

输入描述:

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

import java.util.ArrayList;
public class Solution {
    public ArrayList<String> Permutation(String str) {
       ArrayList<String> result =new ArrayList<String>();
       if(str==null) return result;
       char [] cha = str.toCharArray();
       PermutationCount(cha,0,result);
       Sort(result);                              //按照字典顺序给字符串排序
       return result;
    }
    
    public static void PermutationCount(char [] arr ,int i,ArrayList<String> list){
        if(i==arr.length-1){                      //递归结束条件,当指向最后一位数时,将字符串添加到ArrayList
            String item = String.valueOf(arr);    
           if(!list.contains(item))
                list.add(item);
        }   
        else{
            for(int j=i;j<arr.length;j++){        //每次递归执行完后不是回到上一层,而是执行循环直到循环结束才返回上一层!!!。
                swap(arr,i,j);                    //将每一个数都和第0位的数交换,其余的数执行下面的代码
                PermutationCount(arr,i+1,list);   //剩余的数递归执行全排列
                swap(arr,i,j);                    //这个数和第0位的数交换后还要还原回去
            }
        }
    }
    
    public static void swap(char [] arr,int i,int j){ //交换数组元素
        char temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
    
    public static void Sort(ArrayList<String> res){  //选择排序把ArrayList里的字符串按字典顺序排序
        for(int i=0;i<res.size()-1;i++){
            int temp=i;
            int j;
            for(j=i+1;j<res.size();j++){
                if(res.get(j).compareTo(res.get(temp))<0)//字符串的按字典顺序比较大小
                    temp=j;
            }
            String str=res.get(temp);
            res.set(temp,res.get(i));
            res.set(i,str);
        }
    }
}
posted @ 2019-12-16 16:04  31楼下小黑  阅读(163)  评论(0编辑  收藏  举报