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

递归的复杂度:

  • 时间复杂度: Θ ( 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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值