2.题目描述:
给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
• 示例 1:
输入:s = "a1b2"
输出:["a1b2", "a1B2", "A1b2", "A1B2"]
• 示例 2:
输入: s = "3z4"
输出: ["3z4","3Z4"]
• 提示:
1 <= s.length <= 12
s 由小写英文字母、大写英文字母和数字组成
3. 解法:
算法思路:
只需要对英文字母进行处理,处理每个元素时存在三种情况:
1. 不进行处理;
2. 若当前字母是英文字母并且是大写,将其修改为小写;
3. 若当前字母是英文字母并且是小写,将其修改为大写。
递归函数设计:void dfs(int step)
参数:step(当前需要处理的位置);
返回值:无;
函数作用:查找所有可能的字符串集合,并将其记录在答案列表。
从前往后按序进行递归,递归流程如下:
1. 递归结束条件:当前需要处理的元素下标越界,表示处理完毕,记录当前状态并返回;
2. 对当前元素不进行任何处理,直接递归下一位元素;
3. 判断当前元素是否为小写字母,若是,将其修改为大写字母并递归下一个元素,递归结束时撤销修改操作;
4. 判断当前元素是否为大写字母,若是,将其修改为小写字母并递归下一个元素,递归结束时撤销修改操作;
Java算法代码:
class Solution {
StringBuffer path;
List<String> ret;
public List<String> letterCasePermutation(String s) {
path = new StringBuffer();
ret = new ArrayList<>();
dfs(s,0);
return ret;
}
public void dfs(String s, int pos){
if(pos == s.length()){
ret.add(path.toString());
return;
}
char ch = s.charAt(pos);
//不改变
path.append(ch);
dfs(s,pos+1);
path.deleteCharAt(path.length() - 1); //恢复现场
//改变
if(ch < '0' || ch > '9'){
char tmp = change(ch);
path.append(tmp);
dfs(s,pos+1);
path.deleteCharAt(path.length() -1);//恢复现场
}
}
public char change(char ch){
if(ch >= 'a' && ch <='z') return ch -= 32;
else return ch += 32;
}
}
运行结果:
递归展开:
逻辑展开:
这道题非常简单,拿到之后,笔者没有进行展开之前就已经知道结果是啥样子的了(很适合人脑的检索)。
笔者省略这里。(不懂的读者多看看上面的)
---------------------------------------------------------------------------------------------------------------------------------
记住,相信你的递归函数,它可以做到!
记住,不理解时候,去尝试手动展开!
记住,逻辑展开(你不可能对所有的题目都进行手动展开)!