Description
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.
Example
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 at most 12.
S will consist only of letters or digits.
Solution 1(C++)
class Solution {
public:
vector<string> letterCasePermutation(string S) {
vector<string> res;
if(S.size()==0){res.push_back(S);}
else if(S.size()==1){
if(isdigit(S[0])){res.push_back(S);}
else{
S[0]=toupper(S[0]); res.push_back(S);
S[0]=tolower(S[0]); res.push_back(S);
}
}
else{
vector<string> temp;
if(isdigit(S[0])){string str=""; str.push_back(S[0]); temp.push_back(str);}
else{
string ups="", los="";
ups.push_back(toupper(S[0])); temp.push_back(ups);
los.push_back(tolower(S[0])); temp.push_back(los);
}
string subs = S.substr(1);
vector<string> back=letterCasePermutation(subs);
for(string s: temp){
for(string sb: back){
string sa=s;
sa.append(sb);
res.push_back(sa);
}
}
}
return res;
}
};
Solution 2(C++)
class Solution {
public:
void permute (string S, vector<string>& result, int index)
{
result.push_back(S);
if(index >= S.size())
return;
for (int i = index ; i < S.size(); i++)
{
if (isalpha(S[i]))
{
S[i] ^= 32;
permute (S, result, i+1);
S[i] ^= 32;
}
}
}
vector<string> letterCasePermutation(string S)
{
vector<string> result;
permute(S, result, 0);
return result;
}
};
算法分析
解法一利用的是迭代的方法解决的,类似的题目还有:
LeetCode-21. Merge Two Sorted Lists;
LeetCode-326. Power of Three;
LeetCode-263. Ugly Number。
解法一还要注意的一点就是,
for(string s: temp){
for(string sb: back){
string sa=s;
sa.append(sb);
res.push_back(sa);
}
}
这一句中,很必要的中间一步,string sa=s; sa.append(sb)。而不能直接s.append(sb)。原因自然就是如果按照后者来做,那么在多次循环之后,s并没有更新。那么,一个s就会添加多个sb。就得不到正确答案了。
解法二是主流解法,利用回溯的思想。其实稍微改一改,就可以写成dfs或者bfs。
目前总结一下自己想法中的回溯思路,首先标记,然后迭代,迭代完成后取消标记。这里标记就是 ^ = 32, 取消标记就是 ^ = 32。中间就是迭代。
程序分析
更新一个小技巧,将字母字符转换成对应大小写。
if (isalpha(S[i])){
S[i] ^= 32;
}