package com.waleking.poj; /** * 问题:给定若干个字母(先假定没有重复的字母),要求产生全排列 * @author waleking * 用“插入”的想法来产生全排列,例如已经有了bc,cb。现在新增一个字母a * 对于bc,有三个插入位置,得到abc,bac,bca * 对于cb,有三个插入位置,得到acb,cab,cba * 这样就得到了三个字母的全排列。再新增一个字幕d,也可以用同样的插入方式来处理。 * 看到的总的效果是:用递归(在n-1个字母的基础上产生n个字母的全排列)+循环(对于新增字母的插入)。 * * 输出结果: * 例如,对'a','b','c'进行全排列 * k=0 newWord=bc * k=1 newWord=cb * k=0 newWord=abc * k=1 newWord=bac * k=2 newWord=bca * k=3 newWord=acb * k=4 newWord=cab * k=5 newWord=cba */ public class Permutation { public static char[][] permutate(char[] array){ int k=array.length-1; char[][] dictionary={{array[array.length-1]}}; while(k>0){ dictionary=generateNewWords(dictionary,array[k-1]); k--; } return dictionary; } public static char[][] generateNewWords(char[][] dictionary, char c) { int originalWordLength = dictionary[0].length; int originalWordNum = dictionary.length; int newWordLength = originalWordLength + 1; int newWordNum = newWordLength * originalWordNum; char[][] newWords = new char[newWordNum][newWordLength]; int k = 0;// k用于标记是第k个新单词 for (int i = 0; i < originalWordNum; i++) { // 对于dictionary当中的一个词做插入操作 char[] originalWord = dictionary[i]; for (int j = 0; j < newWordLength; j++) { char[] newWord = new char[newWordLength]; // 拷贝前半部分 for (int l = 0; l < j; l++) { newWord[l] = originalWord[l]; } newWord[j] = c; // 拷贝后半部分 for (int l = j + 1; l < newWordLength; l++) { newWord[l] = originalWord[l - 1]; } newWords[k] = newWord; System.out.print("k=" + k + " newWord="); System.out.println(newWords[k]); k++; } } return newWords; } public static void main(String[] args) { // char[][] dictionary={{'b','c'},{'c','b'}}; // char[][] dictionary = { { 'b' } }; // char character = 'a'; // char[][] newWords = generateNewWords(dictionary, character); // System.out.println(newWords.length); // for (int i = 0; i < newWords.length; i++) { // System.out.println(newWords[i]); // } char[] array={'a','b','c'}; permutate(array); } }