首先看清题目要求:

组合,即:A, B, C, AB, AC, BC, ABC, 都找出来。

这种要求列出所有组合的题目   无关顺序,只要把所有的组合找出即可。

还有一种:

(2)给一个字符串,比如ABC, 把所有的排列列出:ABC,ACB,BAC,BCA,CAB,CBA。

(3)超级混合:

第一种题目的解答思路(找出所有组合):令字符串长度为n,要求组合长度为k,针对第一个字符,情况分为以下两种

                                       (1)假设第一个元素在组合中,在剩下的的n-1个元素中挑k-1个。

                                       (2)假设第一个元素不在组合中,在剩下的n-1个元素中挑k个。

                                        既找组合的函数功能就是,从n个元素中找出k个元素。

                                        此思路可以用迭代实现。

ps:扩展:当字符串中出现重复的字母时,只需要将输出语句改为,将组合加入treeSet集合,可以防止重复。

 

package wangyi;

import java.util.*;

public class Solution {
	 public void Permutation(String str) {
	        char[] arrays=str.toCharArray();
	        permutation(arrays,0,arrays.length);
	        }
          // 方法参数 1数组  2起始位置  3数据长度
	      private void permutation(char[] arrays,int start,int length) {
	    	    if (length==1) //数据长度为1时,数组输出
	    	    	{System.out.println(Arrays.toString(arrays));} 
	    	    
	    	    else{
	    	    	for(int i=start;i<start+length;i++){

	    	        swap(arrays,start,i); 
	        		permutation(arrays,start+1,length-1);
	        		swap(arrays,start,i);//切记一定要换回,否则影响下次的循环交换。
	    	    }
	    	    	}
	    	    }
	     
		
		private void swap(char[] arrays, int start, int i) {
			// TODO Auto-generated method stub
			char temp=arrays[start];
			arrays[start]=arrays[i];
			arrays[i]=temp;
		}
		public static void main(String[] args) {
			Solution one=new Solution();
			one.Permutation("aa");
		} 
}

第二种题目的

解答思路(找出所有排列):

     把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。在图4.14 中,我们用两种不同的背景颜色区分字符串的两部分。    

    我们求整个字符串的排列,可以看成两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。图4.14 就是分别把第一个字符a 和后面的b、c 等字符交换的情形。首先固定第一个字符(如图4.14 (a )所示〉,求后面所有字符的排列。这个时候我们仍把后面的所有字符分成两部分:后面字符的第一个字符,以及这个字符之后的所有字符。然后把第一个字符逐一和它后面的字符交换(如图4.14 (b)所示)       

这其实是很典型的递归思路。

Java 一个字符串的所有子串 java字符串的所有组合_数据