题目:
输入三个字符a、b、c,他们的组合有a、b、c、ab、ac、bc、abc.当交换字符串中的两个字符时,虽然能得到两个不同的排列,但却是同一个组合。比如ab和ba虽然是不同的排列,但只算一个组合。
思路:
本题属于求所有n个字符的长度为m(1<=m<=n)的组合。我们可以把这 n个字符分为两个部分:第一个字符和其余的所有字符。如果组合里包含第一个字符,则下一部在剩余的字符中选取m-1个字符;如果组合里不包含第一个字符,则下一步在剩余的n-1个字符中选取m个字符。
举例来说,现在从a b c 中取长度为2的字符组合。相当于n=3,m=2.
1.第一种情况,字符组合包括a,那么我们再从b c 中取出一个
2.第二种情况,字符组合不包括a,那么我们从剩下b c 再找两个,也就是bc
import java.util.ArrayList;
public class MS38 {
// 求字符串中所有字符的组合abc>a,b,c,ab,ac,bc,abc
public static void perm(String s) {
ArrayList<String> result = new ArrayList<String>();
//从s.length个字符中取i个字符,1<=i<=s,length
for (int i = 1; i <= s.length(); i++) {
perm1(s, i, result);
}
}
public static void perm1(String s,int m , ArrayList<String> res){
if (s.length()<m)
return;
if (res.size()+s.length()==m){
if (s.length()==m)
System.out.println(s);
else System.out.println(res.toString()+s);
return;
}
if (m==0)
{
for (int i = 0; i <res.size() ; i++) {
System.out.print(res.get(i));
}
System.out.println("");
return;
}
if (s.length()!=0)
{
res.add(s.charAt(0)+"");
perm1(s.substring(1,s.length()),m-1,res);
s=s.substring(1,s.length());
res.remove(res.size()-1);
perm1(s,m,res);
}
}
}