首先看清题目要求:
组合,即: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)所示)
这其实是很典型的递归思路。