输出字符串的全部组合/全排列 Java

递归法(遍历字符串--每个字符只能取或不取)

package com.duoduo.day316;

public class TestABC {
	public static void main(String [] args) {
		String s="ABC";
		char[] c=s.toCharArray();
		StringBuffer sb=new StringBuffer();
		for(int i=1;i<=c.length;i++) {
			permutation(c,0,i,sb);
		}
		
	}

	private static void permutation(char[] c,int begin,int len, StringBuffer sb) {
		if(len==0) {                //当都选择结束时打印sb内容
			System.out.println(sb+" ");
			return;
		}
		
		if(begin==c.length)         
			return;
		
		
		sb.append(c[begin]);   				//取
		permutation(c,begin+1,len-1,sb);   	//剩下的里面选len-1个
		sb.deleteCharAt(sb.length()-1); 	//不取
		permutation(c,begin+1,len,sb);   	//剩下的里面选len个
		
	}
}
		





全排列(排列树  回溯法)

将 s[start] 与[start,end]中的元素依次交换 之后,在进行全排列(递归) 

1 2 3     -------1 【2,3】

1 2 3 ----------2【1,3】 

1 2 3     -------3 【2,1】


package com.duoduo.day316;

public class TestStr {
	public static void main(String [] args) {
		String s="ABC";
		fullPermutation(s);
	}
	private static void fullPermutation(String s) {
		permutation(s.toCharArray(),0,s.length()-1);
		
	}
	private static void permutation(char[] c, int start, int end) {
		if(start==end)
			System.out.println(new String(c));
		
		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);	
				}	
			}	
		}
		
	}

	private static void swap(char[] c, int i, int start) {
		char temp=c[i];
		c[i]=c[start];
		c[start]=temp;
		
	}
	

}

输出字符串的全部组合/全排列 Java_第1张图片

你可能感兴趣的:(刷题)