剑指Offer_27_字符串的排列

题目描述

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

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

解题思路

首先固定第一位,然后递归处理后面的位,每次递归中与当前位后面的每一位交换,知道处理到最后一位。由于要按照字母顺序输出,需要对列表排序。

实现

import java.util.ArrayList;
import java.util.Collections;

public class Solution {
    public ArrayList<String> Permutation(String str) {
        ArrayList<String> list = new ArrayList<>();
        if (str == null || str.length() <= 0) return list;
        char[] chars = str.toCharArray();
        recursion(chars, list, 0);
        Collections.sort(list);
        return list;
    }

    private void recursion(char[] chars, ArrayList<String> list, int i) {
        if (i == chars.length) {
            list.add(String.valueOf(chars));
        }
        for (int j = i; j < chars.length; j++){

            if (i !=j && chars[i] == chars[j]) continue;

            swap(chars, i, j);

            recursion(chars, list, i+1);

            swap(chars, i, j);
        }
    }

    private void swap(char[] chars, int i, int j) {
        char tmp = chars[i];
        chars[i] = chars[j];
        chars[j] = tmp;
    }
}
posted @ 2016-08-17 10:56  峰扬迪  阅读(103)  评论(0编辑  收藏  举报