字符串全排列問題,如[abc]
三個元素的數組,會有[abc,acb,bac,bca,cab,cba]
六種排列方式,全排列的實現方式很多,這裏選取一個簡單的遞歸解決方法,代碼簡單,比較容易理解。
/** * 全排列Java源碼實現 * @param buf 待全排列字符串的數組 * @param start 起始位置 * @param end 需要全排列的字串的長度 * @return */ public List<String> perm(char[] buf, int start, int end){ if(start == end){ String result = ""; for(int i=0 ; i<end ; i++){ result += buf[i]; } list.add(result); result = ""; }else{ for(int i=start ; i<buf.length ; i++){ char temp = buf[i]; buf[i] = buf[start]; buf[start] = temp; perm(buf, start+1, end); temp = buf[i]; buf[i] = buf[start]; buf[start] = temp; } } return list; }
遞歸的原理通過交換的方式實現全排列,將第i個字母與第一個字母交換後,對其餘的子數組遞歸全排列。
組合算法
組合算法是取出一個數組的所有子數組的組合,這個在搜索引擎中經常使用,切詞再拼詞。基本方式就是[abc]
的組合方式有[a,b,c,ab,bc,ac,abc]
六種組合方式,總計2^n-1種組合方式。這裏組合的方式採用位運算的操作,比遞歸要簡單。
public static List<String> perm2(char[] buf){ for(int i=1 ; i<(1<<buf.length) ; i++){ String result = ""; for(int j=0 ; j<buf.length ; j++){ //判斷哪一位爲1 if((i & (1<<j)) != 0){ result += buf[j]; } } list.add(result); } return list; }
1<<buf.length
相當於2^buf.length,表示共有這麼多種組合情況,其二進制上的1表示每種情況取哪些字母。i & (1<<j)
表示實際哪一位爲1,取哪些位置的組合。