package mon_11
import java.util.HashSet
public class ArrangeAll {
private static HashSet<String>set = new HashSet<String>()
public static void arrangeAll(String s) {
put(new StringBuilder(s), new StringBuilder())
}
static void put(StringBuilder s1, StringBuilder s2) {
if (s1.length() == 0)set.add(s2.toString())
for (int i = 0i <s1.length()i++) {
put(new StringBuilder(s1).deleteCharAt(i),new StringBuilder(s2).append(s1.charAt(i)))
}
}
public static void main(String[] args) {
arrangeAll("abcd")
System.out.println(set)
}
}
----
输出:
[dcab, acdb, acbd, bcda, bdca, bdac, dbca, bacd, cabd, cdba, cdab, badc, dabc, cadb, dbac, bcad, dacb, cbda, cbad, adbc, adcb, abcd, abdc, dcba]
思路:先有一个起始排列,如1234.从后面扫描,直到找到a[k],a[k]<a[k+1]再从后面扫描,直到找到a[j],这里有 a[k]<a[j]。交换a[k],a[j].再把a[k+1],...a[n-1]排序(从小到大),即得到了一个排列,再循环下去,直到找出所有的排序。用C语言的,参考下: http://user.qzone.qq.com/646203846/infocenter?ptlang=2052