您的位置:首页 > 编程语言 > Java开发

产生全排列的java程序

2010-10-16 15:07 99 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: