题目
给定一个字符串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;
}
递归的复杂度:
- 时间复杂度: Θ ( 2 n ) \Theta(2^{n}) Θ(2n)
- 空间复杂度:
Θ
(
2
n
)
\Theta(2^{n})
Θ(2n)
算法设计;递推
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;
}
递推的复杂度:
- 时间复杂度: Θ ( n 2 ) \Theta(n^{2}) Θ(n2)
- 空间复杂度: Θ ( n 2 ) \Theta(n^{2}) Θ(n2)