用位運算解決字串排列問題

2021-06-21 14:37:38 字數 1219 閱讀 6573

在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...