在csdn部落格看到一篇文章 是阿里實習生店面題
通過觀察題目 我得出了
對於這個題要輸出的子串存在乙個規律:比如輸出我們對所有的字元都以一位編碼 則對於abcde 這樣乙個串 輸出a記作00001(1) 輸出b記作00010(2) 輸出c記作00100(4) 輸出d記作01000(8) 輸出e則記作10000(16) 輸出ab 則記作00011(3) 輸出bc 則記作00110(6) 輸出cd記作01100(12) 輸出de則記作11000(24) 輸出abc記作00111(7) 輸出bcd記作01110(14) 輸出cde記作11100(28) 輸出abcd記作01111(15) 輸出11110(30) 輸出abcde 記作11111(31) 則可以發現規律 前5個記作(2^1-1)*2^i 從第六個開始的四個數記作 (2^2-1)*2^i 之後的3個數記作 (2^3-1)*2^i 之後的兩個數 (2^4-1)*2^i 之後的乙個數記作(2^5-1)*2^i i從零開始. 整體發現規律則是記字串長度為n, 則對於長度為1的個數為n 長度為2的長度為n-1 對於長度為3的個數為n-2 依次類推 這樣我們就可以總結出乙個規律 for (i = n; i > 0; --i) } 在array陣列中儲存的2^0-2^30 這樣再做位運算 從而決定輸出那個位置的字元就可以 但是貌似這樣對時間複雜度沒有什麼改善 也是o(n*n*n)的
從而給出了乙個時間複雜度為o(n^2)的演算法
[cpp] view plaincopy在code上檢視**片派生到我的**片
#include
#include
#include
#define max 15
int main(void)
; int len = strlen(str);
int i = len;
int n = i * (i + 1) / 2;
int k = 0;
int j = 0;
int* numbers = (int*)malloc(sizeof(int) * n);
if (numbers == null)
for (; i > 0; --i)
} for (j = 0; j < n; ++j)
++m;
} printf("\n");
} system("pause");
return 0;
}
字串全排列問題
全排列問題 給定字串 abc,全排列為 abc,acb,bac,bca,cab,cba 遞迴實現 1 標記訪問狀態陣列 val,當前所儲存的字串物件 tmp,儲存結果陣列 res 2 思路 2.1 每次從 0 到 str.length 1,選擇未被訪問的字元加入到 tmp 中,標記當前字元為已訪問 ...
字串全排列問題
問題描述輸入乙個字串,列印出該字串中字元的所有排列 演算法思路通過遞迴的方法來實現。從字串中選出乙個字元作為排列的第乙個字元,然後對剩餘的字元進行全排列。如此遞迴處理。實現def premutation str length len str if length 1 return str array ...
字串排列
在網上看到了乙個操作字串的題目,該題為 字串排列。大概意思是列出字串中所有字元的所有組合並且輸出無重複。自己做了一下,這裡分享該題的思路,和做法。自我覺得實現的有些麻煩 歡迎指點。問題輸入乙個字串,列印出該字串中字元的所有排列。輸入 字串abc。輸出 列印出由字元a,b,c所能排列出來的所有字串ab...