func FullPermutationCycle(in string) (ret []string) { num := len(in) orgIns := []byte(in) var reslut [][]byte for i := 0; i < num; i++ { reslut = append(reslut, []byte{orgIns[i]}) //插入的第一個元素,依次能夠爲字符串中的每一個字符 } fmt.Printf("%v\n", reslut) for i := 1; i < num; i++ { //依次遍歷後續可插入的位置,並同時依次查詢已經插入的字符中是否已經存在該字符,若是已經存在,就不插入了,不然能夠插入字符 //記錄一個存儲的中間過程 var midRelsut [][]byte for _, existV := range reslut { //取已經插入的字符出來,進行判斷 for j := 0; j < num; j++ { //對輸入的字符,進行遍歷 if !bytes.Contains(existV, []byte{orgIns[j]}) { //若是不包含這個字符,就插入 tmp := make([]byte, len(existV)) copy(tmp, existV) tmp = append(tmp, orgIns[j]) midRelsut = append(midRelsut, tmp) } } } reslut = midRelsut } fmt.Printf("=====%v\n", reslut) //轉換爲字符串 for _, cur := range reslut { strCur := string(cur) ret = append(ret, strCur) } return }
func main() { per := FullPermutationCycle("abc") fmt.Printf("%v", per) }
#include<stdio.h> #include<string> //交換兩個字符 void Swap(char *a ,char *b) { char temp = *a; *a = *b; *b = temp; } //遞歸全排列,start 爲全排列開始的下標, length 爲str數組的長度 void AllRange(char* str,int start,int length) { if(start == length-1) { printf("%s\n",str); } else { for(int i=start;i<=length-1;i++) { //從下標爲start的數開始,分別與它後面的數字交換 Swap(&str[start],&str[i]); AllRange(str,start+1,length); Swap(&str[start],&str[i]); } } } void Permutation(char* str) { if(str == NULL) return; AllRange(str,0,strlen(str)); } void main() { char str[] = "abc"; Permutation(str); }
#include<stdio.h> #include<string> //交換兩個字符 void Swap(char *a ,char *b) { char temp = *a; *a = *b; *b = temp; } //在 str 數組中,[start,end) 中是否有與 str[end] 元素相同的 bool IsSwap(char* str,int start,int end) { for(;start<end;start++) { if(str[start] == str[end]) return false; } return true; } //遞歸去重全排列,start 爲全排列開始的下標, length 爲str數組的長度 void AllRange2(char* str,int start,int length) { if(start == length-1) { printf("%s\n",str); } else { for(int i=start;i<=length-1;i++) { if(IsSwap(str,start,i)) { Swap(&str[start],&str[i]); AllRange2(str,start+1,length); Swap(&str[start],&str[i]); } } } } void Permutation(char* str) { if(str == NULL) return; AllRange2(str,0,strlen(str)); } void main() { char str[] = "abb"; Permutation(str); }
#include<stdio.h> #include<string.h> void Combination(char *str) { if(str == NULL) return ; int len = strlen(str); int n = 1<<len; for(int i=1;i<n;i++) //從 1 循環到 2^len -1 { for(int j=0;j<len;j++) { int temp = i; if(temp & (1<<j)) //對應位上爲1,則輸出對應的字符 { printf("%c",*(str+j)); } } printf("\n"); } } void main() { char str[] = "abc"; Combination(str); }