實現字符串全排列

全排列

字符串全排列問題,如[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,取哪些位置的組合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章