剑指Offer系列-面试题28:字符串的排列

来源:互联网 发布:白金数据结局 编辑:程序博客网 时间:2024/06/03 20:00

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

思路:

代码:

public ArrayList<String> Permutation(String str) {    ArrayList<String> list = new ArrayList<String>();    // 输入合法性判断    if (str == null || str.isEmpty()) {        return list;    }    // set去重    HashSet<String> set = new HashSet<String>();    fun(set, str.toCharArray(), 0);    list.addAll(set);    // 排序    Collections.sort(list);    return list;}/*** @param set* @param str* @param num num处的字符串依次和后面的交换*/private void fun(HashSet<String> set, char[] str, int num) {    // 已经全部交换过,结束    if (num == str.length) {        set.add(new String(str));        return;    }    for (int i = num ; i < str.length ; i++) {        swap(str, i, num);        fun(set, str, num + 1);        // 交换位置后要重新交换回来        swap(str, i, num);    }}void swap(char[] str, int i, int j) {    if (i != j) {        char tmp = str[i];        str[i] = str[j];        str[j] = tmp;    }}


0 0