Given a string S, we can transform every letter individually to be lowercase or uppercase to create another string. Return a list of all possible strings we could create.(对于给定的字符串S,我们可以将其中的每一个字母转成大写或者小写来组成另一个新的字符串,返回所有可能的字符串)
Examples:
Input: S = “a1b2”
Output: [“a1b2”, “a1B2”, “A1b2”, “A1B2”]
Input: S = “3z4”
Output: [“3z4”, “3Z4”]
Input: S = “12345”
Output: [“12345”]
Note:
S will be a string with length between 1 and 12.(S是一个长度为1到12的字符串)
S will consist only of letters or digits.(S仅仅由数字和字母组成)
题解:
题目相当于全排列问题,应用回溯法求解。
如下图,从上到下的每一条路径是一种可能的结果,类似于一个树状结构,如果是字母就再分出一个分支,如果是数字则是单一分支。
代码:
class Solution {
public:
vector<string> results;
vector<string> letterCasePermutation(string S) {
string result="";
recruit(S,0,result);
return results;
}
void recruit(const string S, int i, string result) //i 表示 遍历到S中的第i个字符,result 为当前路径的结果
{
if(i==S.size()) //递归终止条件为 遍历完整个字符串
{
results.push_back(result);
return;
}
if(S[i]>='0' && S[i]<='9') //数字一个分支
{
recruit(S,i+1, result+S[i]);
}else{ //字母有两个分支
recruit(S,i+1, result+(char)toupper(S[i]));
recruit(S,i+1, result+(char)tolower(S[i]));
}
}
char changeChar(char ch)
{
if(ch>='a'&&ch<='z')
{
return ch-'a'+'A';
}
if(ch>='A'&&ch<='Z')
{
return ch-'A'+'a';
}
return ch;
}
};
复杂度分析:
时间复杂度为O(2^n),
空间复杂度为O(2^n).