输入任意字符,求全排列,且按照AaBb…Zz的顺序输出
一开始看到题目还没很看懂,题目如下:
给出一个字母的集合,请您编写一个程序,产生从这个集合能构成的所有可能的单词。
例如:给出单词"abc",您的程序产生这三个字母的所有不同的组合——输出单词"abc", “acb”, “bac”, “bca”, “cab” 和"cba"。
程序从输入中获取一个单词,其中的一些字母会出现一次以上。对一个给出的单词,程序产生相同的单词只能一次,而且这些单词按字母升序排列。
输入:
输入给出若干单词。第一行给出单词数,然后每行给出一个单词。一个单词是由A到Z的大写或小写字母组成。大写字母和小写字母被认为是不同的,每个单词的长度小于13。
输出:
对输入中的每个单词,输出这个单词的字母产生的所有不同的单词。输出的单词按字母升序排列。大写字母排在相应的小写字母前,即’A’<‘a’<‘B’<‘b’<…<‘Z’<‘z’。
样例输入
3
aAb
abc
acba
样例输出
Aab
Aba
aAb
abA
bAa
baA
abc
acb
bac
bca
cab
cba
aabc
aacb
abac
abca
acab
acba
baac
baca
bcaa
caab
caba
cbaa
刚开始我还以为是输出的字符串要按照那个顺序排列,但我读了几遍才懂,原来它是想让我按照那个顺序把全排列输出,耽误了很长的时间,所以说语文功底,读题很重要。
下面先给大家说几点本文提到的要点:
- map的应用;
- 递归函数的理解;
对于map,和大家分享的就是熟能生巧了;对于递归函数,建议新手就按照代码一步一步的在草稿纸上把程序运行的过程写出来。
下面附上代码,注释比较详细了~~,如果有写得不够好的地方还望大家能多多指教:
一、dealAz.java
package com.bjq.softmanager.example7;
import java.util.LinkedHashMap;
import java.util.Map;
public class dealAz {
public static Map<Character, Integer> dealAz() {
char[] Az = new char[52];
int x=0,y=0;
Map<Character, Integer> map = new LinkedHashMap<Character, Integer>();
for(int i=0;i<52;i++) {
if(i%2==0) {//偶数位置放大写字母
Az[i] = (char) (‘A’ + x);
x++;
}else {//奇数位置放小写字母
Az[i] = (char) (‘a’ + y);
y++;
}
}
for(int j=0;j<52;j++)//按照0-51的大小顺序排序
map.put(Az[j], j);
return map;
}
}
二、stringToInt.java
package com.bjq.softmanager.example7;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Map;
public class stringToInt {
public static int[] toInt(Map<Character, Integer> map,char[] str,int len) {
int[] strNum = new int[len];//初始化输入的字符串对应的数字串
for(int i=0;i<len;i++) {
if(map.containsKey(str[i])){
strNum[i] = map.get(str[i]); //在map中寻找出与输入字符串相对应的数字串
}
}
Arrays.sort(strNum);
return strNum;
}
}
三、intToString.java
package com.bjq.softmanager.example7;
import java.util.ArrayList;
import java.util.Map;
public class intToString {
static int len = 0;//初始化输入的字符串长度
static ArrayList stringlist = new ArrayList();//初始化装载全排列字符集
public static ArrayList toStirng(Map<Character, Integer> map,int[] textNum) {
// TODO Auto-generated method stub
len = textNum.length;
char[] afterTo = new char[len];//按A-z顺序排序后的输入字符串
for (int i = 0; i < len; i++) {
for(Map.Entry<Character, Integer> mEntry : map.entrySet()) {
if(mEntry.getValue() == textNum[i])
afterTo[i] = mEntry.getKey();
}
}
permutation(afterTo, 0, afterTo.length-1);//递归找全排列
return stringlist;
}
public static void permutation(char[] c,int start,int end) {
if(start == end) {
stringlist.add(new String(c));//如果只剩一个字符,代表无法再交换,将其加入到list中
}else {
for(int i=start;i<=end;i++) {
if(i!=start&&c[i]!=c[start]||i==start) {
swap(c,i,start);//将前面的字符和后面的字符交换,其中包括一次第一个字符自身的交换
permutation(c, start+1, end);//固定第一个字符,将剩下的子串进行同样的交换操作
swap(c, i, start);//恢复最初的字符顺序,
//如:输入字符为aAb,排序后为Aab,固定A的话,经过两次递归,最后字符串c会变成Aba,为了固定a,需把Aba再交换成Aab
}
}
}
}
private static void swap(char[] c, int i, int start) {//将c中的第i个位置与start位置对应的字符交换
// TODO Auto-generated method stub
char temp = c[i];
c[i] = c[start];
c[start] = temp;
}
}
四、example7.java
package com.bjq.softmanager.example7;
import java.util.ArrayList;
import java.util.Map;
import java.util.Scanner;
import com.bjq.softmanager.example7.stringToInt;;
public class example7 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Character, Integer> map = dealAz.dealAz();//获取Az与051的对应关系
System.out.println(“请输入字符串个数:”);
String times = new Scanner(System.in).nextLine();
int timess = Integer.valueOf(times);
int t = 0;
while(t!=timess) {
System.out.println(“请输入字符串:”);
String string = new Scanner(System.in).nextLine();
char[] text = string.toCharArray();//将输入的string转换为char[]
int textNum[] = stringToInt.toInt(map,text,string.length());//将输入的字符按照A、a、B、b…顺序排序
ArrayList resultStrings = intToString.toStirng(map, textNum);//得到全排列
for (int i = 0; i < resultStrings.size(); i++) {
System.out.println(resultStrings.get(i));
}
t++;
resultStrings.clear();
}
System.out.println("-----Finish-----");
}
}
以上就是所有代码,仅供参考。