给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。
返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
示例 1:
输入:s = "a1b2"
输出:["a1b2", "a1B2", "A1b2", "A1B2"]示例 2:
输入: s = "3z4"
输出: ["3z4","3Z4"]提示:
1 <= s.length <= 12s由小写英文字母、大写英文字母和数字组成
解题思路:回溯
相信做了这么多回溯练习,这道题就不会很难了,其实也就是一个排列的问题!
根据题意,对于数字字符来说,它只有一种选择,就是直接添加到结果集中,没有其它的路径可以选择!而对于字母字符来说就不一样了,它是有两条路径可以选择的,第一条就是它本身,假如它是小写的话,那么第二条路径就是它的大写的情况!
综上所述,对于数字字符我们只需要进行一次三部曲操作(即处理当前节点、递归、回溯处理),而对于字母字符来说则需要进行两次三部曲操作,如下图所示:
然后剩下要注意的就是对于字母字符进行第二次三部曲操作之前,要先将第一次三部曲操作的回溯处理完成了,再进行第二次三部曲操作,不然会影响结果的!
剩下的都是一样的si'x
class Solution {
private:
vector<string> ret; // 存放结果集
string path; // 存放当前路径字符的字符串
public:
vector<string> letterCasePermutation(string s) {
dfs(s, 0);
return ret;
}
void dfs(string& s, int index)
{
// 递归函数出口
if(index == s.size())
{
ret.push_back(path);
return;
}
// 进行一次处理当前节点、递归
path.push_back(s[index]);
dfs(s, index + 1);
// 如果是字母的话,则要再处理其对应大小写的另一条路径
if(s[index] < '0' || s[index] > '9')
{
path.pop_back(); // 先把上面那次递归的结果进行回溯处理
if(s[index] >= 'a' && s[index] <= 'z')
path.push_back(s[index] - 32);
else
path.push_back(s[index] + 32);
dfs(s, index + 1);
}
// 进行回溯处理
path.pop_back();
}
};