「递归算法」:字母大小写全排列

18 阅读1分钟

一、题目

给定一个字符串 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;
        }
    }
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!