正序输出字符串所有组合算法
/* * str : 输入的字符串 * output : 临时保存一个输出 * num : 当前一个输出总共有多少位 * start : 当前以那个位置上的字符起头的 * cur : 当前输出的是哪一位 * index : 当前输出的是位的迭代器 * 输入: abcd * 输出:a b c d ab ac ad abc bcd abcd */ void recursion(char * str,char * output,int num,int start,int cur,int index){ int len = (int)strlen(str); if (num == cur) { // 取最后一位 if (index < len) { output[cur-1] = str[index]; printf("%s ",output); recursion(str,output,num,start,cur,index+1); } }else{ // 遍历取以start起头的第cur位的值 // 这个值的范围是 [start + cur - 1 ~ len] for (int i = start + cur - 1; i < len; i++){ output[cur-1] = str[i]; // 递归取第cur位的值 recursion(str,output,num,start,cur+1,i+1); // 取完所有的cur位后,把起头位置start往后移一位 start++;; } } } void recurs(char * str){ char output[128] = {0}; int len = (int)strlen(str); for (int i = 1; i <= len ; i++) { memset(output, 0, 128); recursion(str,output,i,0,1,0); printf("\n"); } } int main(int argc, const char * argv[]) { char * str = "abcd"; recurs(str); return 0; }
输出:
a b c d ab ac ad bc bd cd abc abd acd bcd abcd Program ended with exit code: 0