剑指Offer------字符串的排列(全排列)

来源:互联网 发布:安卓sd卡数据恢复软件 编辑:程序博客网 时间:2024/06/01 10:03
题目描述 :输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,

                  c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

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




import java.util.ArrayList;import java.util.Collections;import java.util.HashSet;/** *  * @author zy * @date 2017年10月4日 下午7:01:59 * @Decription 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b, *             c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: *             输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 *  *  */public class Ex17 {public ArrayList<String> Permutation(String str) {ArrayList<String> result = new ArrayList<>();if (str == null || str.length() == 0) {return result;}HashSet<String> set = new HashSet<>();permutationHelper(set, str.toCharArray(), 0);result.addAll(set);Collections.sort(result);return result;}//全排列算法void permutationHelper(HashSet<String> set,char[] cs,int k){if (k == cs.length) {set.add(new String(cs));return;}for(int i=k;i<cs.length;i++){swap(cs, i, k);permutationHelper(set, cs, k+1);swap(cs, i, k);}}//交换字母位置算法void swap(char[] cs,int i,int j){if (i!=j) {char temp = cs[i];cs[i] = cs[j];cs[j] = temp;}}}


原创粉丝点击