【剑指offer28:字符串的排列】【java】

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

import java.util.ArrayList;
import java.util.Arrays;

/**
 * Created by Fay on 2018/2/26.
 */
public class leetcode28 {
    ArrayList<String> list = new ArrayList<String>();

    public ArrayList<String> Permutation(String str) {
        if(str == null){
            return null;
        }
        char[] arr = str.toCharArray();
        recursionArrange(arr,0,arr.length-1);
        return list;
    }

    public void recursionArrange(char[] arr ,int start, int end){

        if(start == end){
            String str = String.valueOf(arr);
            list.add(str);
        }else{
            for(int i=start; i<=end; i++){
                //如果碰到相同的字母,则不做交换,跳过本次循环(首字母除外,会有一次交换)
                if(i!=start && arr[start]==arr[i]){
                    continue;
                }else{
                    swap(arr, i, start);
                    recursionArrange(arr, start+1, end);
                    swap(arr, i ,start);
                }

            }
        }

    }

    public void swap(char[] arr,int m,int n){
        char temp = arr[m];
        arr[m] = arr[n];
        arr[n] = temp;
    }

    public static void main(String args[]){
       leetcode28 test = new leetcode28();
       ArrayList<String> list = test.Permutation("aba");
       for(String str:list){
           System.out.println(str);
       }
    }
}

这里有一个地方很奇怪,如果是做递归交换的话,每次交换完之后会恢复原样,那么对于abc来说,最后两个应该是cab和cba的顺序,为何牛客网测试给出了相反的顺序?是否有人可以回答一下~

 

 

posted @ 2018-02-28 10:25  dearcs_zyf  阅读(132)  评论(0编辑  收藏  举报