使用的遞迴的方法:既然是組合,則順序不要求順序了。
主要原理就是從第乙個字元開始,分兩種情況:1.留下此字元;2.去除此字元。 再對剩下的字元求組合。
然後再第二個字元,分兩種情況,再對剩下的字元求組合
#include #include #include template inline void swap(t &a , t &b)
void doprintallcombination(char *str , int begin , int end)
tmp = str[end+1]; //不要此字元
str[end+1] = '\0';
printf("%s\n" , str);
str[end+1] = tmp;
return;
} //第二種情況,去除此字元
swap(str[begin],str[end]);
doprintallcombination(str , begin , end-1);
swap(str[begin] , str[end]);
//第一種情況,留下此字元
doprintallcombination(str , begin+1 , end);
}void printallcombination(char *str)
int main(int argc , char *argv)
char *str = (char*)malloc(strlen(argv[1]) + 1);
strcpy(str , argv[1]);
printf("orignate string : %s\n" , str);
printallcombination(str);
free(str);
return 0;
}
結果:orignate string : abcbc
cbaacab
abc結果中有些字元的順序改變了,如cb ,,按正常順序可能是bc,,,
這是因為我的這個程式的空間複雜度為o(1)
如果你要求產生的組合與原始字元的順序一致,,則可以使用mask代替,,標記使用不使用此字元。此時空間複雜度為o(n)
反正時間複雜度都為o(n)
求組合數的C 實現
include iostream using namespace std intcom intn,intr returns intmain return0 上面的 只適合較小的n,經測試,當n 33 時,對於所有小於等於 n 的 m均能計算出值。n 33時,僅對於較小的m適用。在網上找了找,學會了計...
C語言 移動字母
本題要求編寫函式,將輸入字串的前3個字元移到最後。函式介面定義 void shift char s 其中char s是使用者傳入的字串,題目保證其長度不小於3 函式shift須將按照要求變換後的字串仍然存在s裡。裁判測試程式樣例 include include define maxs 10 void...
c 電話號碼的字母組合
問題 給定乙個僅包含數字2 9的字串,返回所有它能表示的字母組合。給出數字到字母的對映如下 與 按鍵相同 注意 1 不對應任何字母。分析 這道題是利用多向遞迴完成的,首先把字元 234 轉換為數字234,並找到數字234對應的字母如下圖,然後開始讓a去和數字3裡面對應的第乙個字母匹配,再讓他們兩匹配...