1.题目

2.思路
深度优先遍历(回溯)




补充:大小写字符转换
charArray[index] ^= 1 << 5;
大写字符与其对应的小写字符的 ASCII 的差为 32,32 这个值如果敏感的话,它是 2
5
,在编程语言中,可以表示为 1 << 5。而
变换大小写这件事等价于:
如果字符是小写字符,减去 32 得到大写字符;
如果字符是大写字符,加上 32 得到小写字符。
而这两者合并起来,就是给这个字符做一次不进位的加法,即异或上 1 << 5
补充2:
char[] ch:当前正在操作的状态/路径载体(我们在 ch 上改大小写)
int index:当前决策到第几个字符(也就是"递归到了第几层")
index 就是"当前处理到哪一位了",
每递归一层就走到下一位 → 所以是 index + 1。
List res:结果收集容器,保存每一条完整路径
3.代码实现
java
class Solution {
public List<String> letterCasePermutation(String s) {
//结果列表,保存字符串
List<String> res=new ArrayList<>();
//将字符串变成字符数组
char[] ch=s.toCharArray();
//回溯遍历字符数组
//路径(已经做出的选择)、当前决策的位置、结果收集容器,再加上原始输入 / 约束信息。
dfs(ch,0,res);
return res;
}
// 回溯函数:在 ch 的基础上,从 index 这个位置开始,生成所有可能的大小写组合
public void dfs(char[] ch,int index,List<String> res)
{
// 终止条件:走到字符串末尾,当前 ch 就是一种方案
if(index==ch.length)
{ //此时 ch 代表一种完整的方案,把它转成字符串加入结果列表
res.add(new String(ch));
// 返回上一层递归
return;
}
// 如果是字母:两条分支------小写一个、大写一个
if(Character.isLetter(ch[index]))
{
// 分支1:改成小写
ch[index]=Character.toLowerCase(ch[index]);
dfs(ch,index+1,res);
// 分支2:改成大写
ch[index]=Character.toUpperCase(ch[index]);
dfs(ch,index+1,res);
}else{// 如果是数字:只能原样往下走一次
dfs(ch,index+1,res);
}
}
}