一、题目
给定一个字符串 s
,通过将字符串 s
中的每个字母转变大小写,我们可以获得一个新的字符串。
返回
所有可能得到的字符串集合
。以 任意顺序 返回输出。
示例 1:
输入:s = "a1b2"
输出:["a1b2", "a1B2", "A1b2", "A1B2"]
示例 2:
输入: s = "3z4"
输出: ["3z4","3Z4"]
提示:
1 <= s.length <= 12
s
由小写英文字母、大写英文字母和数字组成
二、思路解析
这道题也是属于递归一类的,具体的实现还是要通过画决策树,来决定每一步需要做什么。
就拿 s = "a1b2" 来举例,它的决策树如下:
编辑
每一层的递归分为 “转变大小写” 和 “不转变大小写” ,而元素值为数字的,则可以直接跳过,因为只有字母才需要转变大小写。
我是通过一个辅助函数 change
改变当前字母的大小写,具体实现就是在原有基础上加减 32。
而当 pos
等于字符串的长度时,意味着我们已经探索完所有字符,当前 path
记录的字符串是一个有效的组合,将其添加到结果列表 ret
中。
三、完整代码
class Solution {
List<String> ret;
StringBuffer path;
public List<String> letterCasePermutation(String s) {
ret = new ArrayList<>();
path = new StringBuffer();
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;
}
}
}
以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!