有重复字母的全排列的java程序
2010-10-16 17:07
239 查看
package com.waleking.poj; import java.util.HashSet; /** * 问题:给定若干个字母(这个时候有重复的字母),要求产生全排列 * @author waleking * 算法思想来自Brother Wang, double chong * * 用“取出”的想法来产生全排列,例如对a,b,c。 * 1取出a,再取出b和c,取出b和c的方法会产生b与c的全排列, * 这个b,c的全排列{bc,cb}再和第一次取出的放在第一个位置的a做拼接,产生{abc,acb} * 2取出b,再取出a和c,方法和上述相同。 * * 看到的总的效果是:用循环(取出第一个位置的字母)+递归(对于剩下的n-1个字母产生全排列)。 * 在循环体中对取出的字母做去重,如果这个字母已经被取出过,就不再取出,而是直接跳过。 * * 输出结果: * 例如,对'a','a','b',‘c'进行全排列 aabc aacb abac abca acab acba baac baca bcaa caab caba cbaa */ public class Permutate2 { public static void f(char[] array,char[] word){ HashSet<String> set=new HashSet<String>(); for(int i=0;i<array.length;i++){ //选出第一个位置上的字母,打印出来, 已经挑选出来的字母添加的word中 //如果这个字母已经被跳出来过一次,就跳过它 if(!set.contains(String.valueOf(array[i]))) set.add(String.valueOf(array[i])); else continue; //第一个位置上的字母已经被选出来,现在挑选第二个位置上的字母,可以使用递归的办法 //前提是从array当中去掉已经被挑选出来的字母,用新的array if(array.length>1){ char[] newArray=new char[array.length-1]; //拷贝前半部分 for(int j=0;j<i;j++){ newArray[j]=array[j]; } //拷贝后半部分 for(int j=i+1;j<newArray.length+1;j++){ newArray[j-1]=array[j]; } //调用f之前,先计算出word,这个word是最终要输出的结果 char[] newWord=new char[word.length+1]; for(int m=0;m<word.length;m++) newWord[m]=word[m]; newWord[newWord.length-1]=array[i]; f(newArray,newWord); }else{ char[] newPrevious=new char[word.length+1]; for(int m=0;m<word.length;m++) newPrevious[m]=word[m]; newPrevious[newPrevious.length-1]=array[0]; System.out.println(newPrevious); return; } } } public static void main(String[] args){ char[] array={'a','a','b','c'}; char[] word={}; f(array,word); } }
相关文章推荐
- H面试程序(8):不含重复字母的字符串的全排列
- 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
- java__给定一个升序排列的数组,去掉重复的数,并输出新的数组的长度
- 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩规则: 1、仅压缩连续重复出现的字符。比如字符串"abcbc
- java版本: 把手机号码里重复数字出现的次数按从多到少排列打印出来
- Java写的查找重复电话号码程序-Java基础-Java-编程开发
- 【小程序】JAVA实现从10~50中随机生成50个数,统计出现的数字及次数,输出出现最多的次数及对应的数字,按数字升序排列。
- 面试:java程序写出四个数的程序,每个数都不能重复 2
- 简单java程序--猜字母游戏
- 2013年用友校招编程题:用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列
- Java 写一个方法判断一个字符串是否对称 "asdfgasdfg"、编写一个程序,将下面的一段文本中的各个单词的字母顺序翻转,
- 编写Java程序,打印下图所示的字母组成的菱形(且每次运行时该菱形大小可能不一)。
- Java小程序:输入字母和数字,输出时字母在前数字在后
- Java找出一个字符串中重复最多字母的次数
- 用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列 如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连
- java生成10位不重复的字母+数字组合
- 全排列算法:不含重复元素,包含重复元素,字母序排列
- 【Java】编写一个程序,输出一个字符串中的大写英文字母数,小写英文字母数以及非英文字母数
- 算法笔记_222:串中取3个不重复字母(Java)
- java画图程序_图片用字母画出来_源码发布_版本二