輸入一個字符串,長度不超過9(可能有字符重複),字符只包括大小寫字母。java
求整個字符串的排列,能夠分爲兩步:首先求全部可能出如今第一個位置的字符,即把第一個字符和後面全部字符交換。第二步固定第一個字符,求後面全部字符序列。這個時候咱們把後面的字符分紅兩部分:後面字符的第一個字符以及這個字符以後的全部字符。而後把第一個字符逐一和它後面的字符交換。數組
package com.swordOffer.stringPermutation19; import java.util.ArrayList; import java.util.Scanner; import java.util.TreeSet; /** * Created by Feng on 2017/5/16. * 題目描述 * 輸入一個字符串,按字典序打印出該字符串中字符的全部排列。 * 例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的全部字符串abc,acb,bac,bca,cab和cba。 * 輸入描述: * 輸入一個字符串,長度不超過9(可能有字符重複),字符只包括大小寫字母。 */
public class StringPermutation { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { String str = sc.nextLine(); ArrayList<String> result = permutation(str); for (String string : result) { System.out.println(string); } } } public static ArrayList<String> permutation(String str) { ArrayList<String> arrayList = new ArrayList<>(); //判斷字符串是否爲空
if (str == null || str.length() == 0) { return arrayList; } //獲取字符串的字符數組
char[] chs = str.toCharArray(); //利用TreeSet沒有重複元素的特色,去除重複的排列
TreeSet<String> treeSet = new TreeSet<>(); permutation(chs, 0, treeSet); //將排列存入ArrayList集合
arrayList.addAll(treeSet); return arrayList; } private static void permutation(char[] chs, int begin, TreeSet<String> treeSet) { if (chs == null || chs.length == 0 || begin < 0 || begin > chs.length - 1) { return; } //若是隻有一個字符,直接將該字符加入treeSet
if (begin == chs.length - 1) { treeSet.add(String.valueOf(chs)); } else { for (int i = begin; i < chs.length; i++) { //固定一個字符,而後交換其他的字符 //若是i和begin相等則不須要交換,繼續遞歸
if (i != begin) { swap(chs, begin, i); } //遞歸操做後面的字符
permutation(chs, begin + 1, treeSet); if (i != begin) { swap(chs, begin, i); } } } } /** * 交換字符 * @param chs * @param x * @param y */
private static void swap(char[] chs, int x, int y) { char temp = chs[x]; chs[x] = chs[y]; chs[y] = temp; } }