leetcode:字母大小写全排列
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
示例:
输入: S = “a1b2”
输出: [“a1b2”, “a1B2”, “A1b2”, “A1B2”]
输入: S = “3z4”
输出: [“3z4”, “3Z4”]
输入: S = “12345”
输出: [“12345”]
注意:
S 的长度不超过12。
S 仅由数字和字母组成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-case-permutation
一开始直接把回溯算法的模板写了出来,后来发现其实根本不需要多出一个记录选择的数组,因为这次的题目不需要打乱原先字符串的排列顺序,直接在原先的排列顺序上进行选择字母大小写即可,所以处在选择节点的时候,可以将选择数组看成是[“a”,“A”],故在实现回溯算法的时候,for循环只需要执行两次,重点是层数和数组的第几位要对应起来,查看S[layer]是否是字母,若不是的话,直接执行下一层的回溯,执行完毕后break,防止重复执行,若是字母的话,再判断这是第几次循环,第一次循环取小写字母(也可以取大写,顺序不同罢了),第二次循环取大写字母,之后都执行回溯算法,直到层数和字符串长度相等。
以下是我的代码:
# include<iostream>
# include<string>
using namespace std;
class Solution {
public:
vector<string> letterCasePermutation(string S) {
vector<string> result;
//vector<bool> select(S.size(),false);
string tempString=S;
trackback(result,tempString,S,0);
return result;
}
void trackback(vector<string> &result,string tempString,string S,int layer)
{
if(layer==S.size())
{
result.emplace_back(tempString);
return;
}
for(int i=0;i<2;i++)
{
if(S[layer]<65)
{
trackback(result,tempString,S,layer+1);
break;
}
if(i==0) tempString[layer]=(S[layer]<97?S[layer]+32:S[layer]);
else if(i==1) tempString[layer]=(S[layer]>=97?S[layer]-32:S[layer]);
trackback(result,tempString,S,layer+1);
}
}
};
还有一点就是要知道a在ASCII中对应的值为97,A对应的值为65,直到差值之后就好转化了。