[784].字母大小寫全排列

字母大小寫全排列

 


題目

給定一個字符串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;
}

遞歸的複雜度:

  • 時間複雜度:Θ(2n)\Theta(2^{n})
  • 空間複雜度:Θ(2n)\Theta(2^{n})
     

算法設計;遞推

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;
}

遞推的複雜度:

  • 時間複雜度:Θ(n2)\Theta(n^{2})
  • 空間複雜度:Θ(n2)\Theta(n^{2})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章