给定一个字符串S
,通过将字符串S
中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
示例:
输入: S = "a1b2"
输出: ["a1b2", "a1B2", "A1b2", "A1B2"]
输入: S = "3z4"
输出: ["3z4", "3Z4"]
输入: S = "12345"
输出: ["12345"]
注意:
S
的长度不超过12
。
S
仅由数字和字母组成。
思路:设S中一共有count个字母,则共有2^count个不同的组合。
C
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
char** letterCasePermutation(char* S, int* returnSize)
{
int n=strlen(S);
int count=0;
char cc;
for(int i=0;i<n;i++)
{
if(S[i]>='a' && S[i]<='z' || S[i]>='A' && S[i]<='Z')
{
count++;
}
}
int m=pow(2,count);
char** res=(char**)malloc(sizeof(char*)*m);
for(int i=0;i<m;i++)
{
res[i]=(char*)malloc(sizeof(char)*n);
}
int k=0; //k表示每一行的字符数
int size=1; //size表示目前共size行
for(int i=0;i<n;i++)
{
if(S[i]>='0' && S[i]<='9')
{
for(int j=0;j<size;j++)
{
res[j][k]=S[i];
}
k++;
}
else
{
for(int j=0;j<size;j++)
{
memcpy(res[j+size],res[j],k);
res[j][k]=S[i];
if(S[i]>='a' && S[i]<='z')
{
cc=S[i]-32;
res[j+size][k]=cc;
}
else
{
cc=S[i]+32;
res[j+size][k]=cc;
}
}
k++;
size*=2;
}
}
for(int i=0;i<size;i++)
{
res[i][k]='\0';
}
*returnSize=size;
return res;
}
C++
class Solution {
public:
vector<string> letterCasePermutation(string S)
{
int n=S.length();
vector<string> res{""};
for(int i=0;i<n;i++)
{
int len=res.size();
if(S[i]>='0' && S[i]<='9')
{
for(int j=0;j<len;j++)
{
res[j].push_back(S[i]);
}
}
else
{
for(int j=0;j<len;j++)
{
res.push_back(res[j]);
res[j].push_back(tolower(S[i]));
res[j+len].push_back(toupper(S[i]));
}
}
}
return res;
}
};
python
class Solution:
def letterCasePermutation(self, S):
"""
:type S: str
:rtype: List[str]
"""
res=['']
n=len(S)
for i in range(0,n):
m=len(res)
if S[i]>='0' and S[i]<='9':
for j in range(0,m):
res[j] += S[i]
else:
for j in range(0,m):
res.append(res[j])
res[j] += S[i]
if S[i].islower():
temp=ord(S[i])-32
res[j+m] += (chr(temp))
else:
temp=ord(S[i])+32
res[j+m] += (chr(temp))
return res