关于abc全排列的方法

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;
		}
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值