字母大小寫全排列
題目
給定一個字符串S
,通過將字符串S
中的每個字母轉變大小寫,我們可以獲得一個新的字符串。返回所有可能得到的字符串集合。
示例:
輸入: S = "a1b2"
輸出: ["a1b2", "a1B2", "A1b2", "A1B2"]
輸入: S = "3z4"
輸出: ["3z4", "3Z4"]
輸入: S = "12345"
輸出: ["12345"]
函數原型
char ** letterCasePermutation(char * S, int* returnSize){}
邊界判斷
char ** letterCasePermutation(char * S, int* returnSize){
if( S == NULL || *S == '\0' )
return NULL;
}
算法設計:遞歸
int cnt = 0;
int len = 0;
void recv(char s[], int i, char **ans){
if( i == strlen(s) ){ // 最後一個字母
ans[cnt] = (char *)malloc(sizeof(char*) * 13); // 開闢列,二維數組要分倆次開闢
strncpy(ans[cnt], s, len); // 拷貝
ans[cnt][len] = '\0'; // 雖然拷貝了,但還得加'\0'
cnt ++;
}else{
if( isdigit(s[i]) ){ // s[i] 是數字
recv(s, i+1, ans); // 看 s[i+1]
}else{
s[i] = tolower(s[i]); // 轉爲小寫字母
recv(s, i+1, ans);
s[i] = toupper(s[i]); // 轉爲大寫字母
recv(s, i+1, ans);
}
}
}
char ** letterCasePermutation(char * S, int* returnSize){
if( S == NULL || *S == '\0' )
return NULL;
len = strlen(S);
char **ans = (char**)malloc(sizeof(char*) * pow(2, len));
recv(S, 0, ans);
*returnSize = cnt; // 返回行數
return ans;
}
遞歸的複雜度:
- 時間複雜度:
- 空間複雜度:
算法設計;遞推
char ** letterCasePermutation(char * S, int* returnSize){
int len = strlen(S), size = 1;
char **res = (char**)malloc(sizeof(char*)*pow(2, len));
*res = (char*)calloc(len + 1, sizeof(char));
strncpy(*res, S, len);
for (int i = 0; i < len; i++){
if (S[i]>'9'){
int k = size;
for (int j = 0; j < k; j++){
res[k + j] = (char*)calloc(len + 1, sizeof(char));
strncpy(res[k + j], res[j], len);
res[k + j][i] = S[i] < 'a' ? S[i] + 32 : S[i] - 32;
size++;
}
}
}
*returnSize = size;
return res;
}
遞推的複雜度:
- 時間複雜度:
- 空間複雜度: