输出字符串所有组合
描述
输入字符串"abc",则输出a、b、c、ab、ac、bc、abc 共7种组合。
分析
方法一,递归法。遍历每个字符串,每个字符两种情况取或不取。时间复杂度为O(n的2次方)。
方法二,根据每个字符只有取和不取两种情况,0表示不取,1表示取该字符,则原题可以解释为要求输001到111这个组合对应的字符串。
代码
方法一
public class Test { /* * 递归 * */ public static void combinate(char[] chars,int begin,int len,StringBuffer sb){ if(len==0){ System.out.println(sb); return; } if(begin==chars.length) return; sb.append(chars[begin]); //取当前字符 combinate(chars,begin+1,len-1,sb); sb.deleteCharAt(sb.length()-1); //不取当前字符 combinate(chars,begin+1,len,sb); } public static void main(String[] args) { String str="abc"; char[] chars=str.toCharArray(); StringBuffer sb=new StringBuffer(); for(int i=1;i<=str.length();i++){ combinate(chars,0,i,sb); } } }
方法二
public class Test { public static void combinate(char[] c){ if(c==null) return; int len=c.length; boolean used[]=new boolean[len]; //默认值false; char cache[]=new char[len]; int result=len; while(true){ int index=0; while(used[index]){ used[index]=false; ++result; if(++index==len) return; } used[index]=true; cache[--result]=c[index]; System.out.print(new String(cache).substring(result)+" "); } } public static void main(String[] args) { String str="abc"; char[] c=str.toCharArray(); combinate(c); } }