package test3;
import java.util.ArrayList;
/*
* 字符串全排列
* 分析
* 最终结果为几个字符串数组依次遍历的结果
* 如果字符串的位数为x
*
* 主方法
* 创建字符串
* 取得字符串的长度,以长度为循环次数和截取位数,使用打印方法打印结果
* 如,字符串为4位
* 第一次循环,打印截取位数为1的所有可能
* 第二次循环,打印截取位数为2的所有可能
* 第三次循环,打印3位数的所有可能
* 第四次循环,打印4位数的所有可能
* 打印方法thesort
* 获取需要打印的字符串数组,并打印出来
* 获取方法theget
* 如果,字符串是1位数,就将字符串转化成字符数组,然后再把字符数组转化成字符串数组,返回
* 如果,字符串是2位以及2位以上
* 例如,如果位数为4
* 可以先建个集合用来存储结果.
* 那么,先获取 3位数时需要打印的字符串数组(递归思想),也就是3位数的全排列结果
* 然后,遍历数组,每一次循环相当于给4位数的最终结果选择一个"放在第一位的字符"
* 那么,4位数的最后结果格式就是,"字符(通过外循环得到)" + "3位数的全排列结果的元素"
* 通过分析,知道这个"放在第一位的字符"不能出现在后面跟着的"3位数的全排列结果的元素"中.
* 所以,将"3位数的全排列结果"遍历,并进行判断
* 将3位数全排列结果的每一个元素转化成数组(内循环得到每个元素,然后再转化并判断)
* 然后将数组的每个元素,和外循环选择的"首位字符"进行比较,如果相等,则跳过这个元素(注意跳出点)
* 如果内循环结束,也没有发现相等的,就表明这个元素不包含首字符,就可以将此元素添加入集合中
* 这就相当于有3个for循环,外循环--选择首字符,中循环--遍历3位数结果的每个元素,内循环--遍历元素中的每个字符,
* 跳出的时候,内循环有一个达成条件,直接开始下一次中循环.
* 所有循环结束后,将集合变为字符串数组,并返回.
*
*
*/
public class Test012 {
public static void main(String[] args) {
String s = "abcd";
for(int x = 1;x<=s.length();x++){
thesort(s,x);
}
}
public static void thesort(String s,int i){
//获取相应位数的全排列,然后打印出来
String[] str = theget(s,i);
for(String s3 : str){
System.out.print(s3+" ");
}
System.out.println();
}
public static String[] theget(String s,int i){//取2个及以上字符的方法
if(i==1){
//输入字符串,返回其截取1位的全排列的数组
String[] str = new String[s.length()];
char[] ch = s.toCharArray();
for(int x = 0;x<ch.length;x++){
str[x] = ""+ch[x];
}
return str;
}else{
ArrayList<String> list = new ArrayList<String>();
//若不为1,先遍历数组来确定第一位要放哪个字符,然后获取截取i-1位的全排列,然后将每个内容变为一个集合,通过集合的方法判断每个元素中是否包含
String[] str2 = theget(s,i-1);//递归,获取少一位截取的结果.
char[] ch2= s.toCharArray();//参数的字符串转字符数组,准备判断
for(int y= 0;y<ch2.length;y++){
//外循环,遍历每个元素,选择首个元素为ch2[y];
p:for(int z = 0;z<str2.length;z++){
//内循环,遍历i-1的每个元素
String s1 = str2[z];//将i-1的元素拿出来,变为数组
char[] ch3 = s1.toCharArray();
//遍历判断里面有没有包含外循环选中的元素.
for(char ch4 : ch3){
if(ch4==ch2[y]){
//如果有相等,就跳过这个元素
continue p;
}
}
//这个元素没有包含外循环的元素,就将首字母+元素添加到集合
list.add(ch2[y]+s1);
}
}
//全循环结束后,需要将集合变为字符串数组返回
String[] strc = new String[list.size()];
int in = 0;
for(String st : list){
strc[in] = st;
in++;
}
return strc;
}
}
}
关于abc全排列的方法
最新推荐文章于 2022-02-13 16:18:47 发布