21.字母大小全排列(medium)

1.题目链接:784. 字母大小写全排列 - 力扣(LeetCode)784. 字母大小写全排列 - 给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。 示例 1:输入:s = "a1b2"输出:["a1b2", "a1B2", "A1b2", "A1B2"]示例 2:输入: s = "3z4"输出: ["3z4","3Z4"] 提示: * 1 <= s.length <= 12 * s 由小写英文字母、大写英文字母和数字组成https://leetcode.cn/problems/letter-case-permutation/description/

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;
    }
}

运行结果:

递归展开:

逻辑展开:

这道题非常简单,拿到之后,笔者没有进行展开之前就已经知道结果是啥样子的了(很适合人脑的检索)。

笔者省略这里。(不懂的读者多看看上面的)

---------------------------------------------------------------------------------------------------------------------------------

记住,相信你的递归函数,它可以做到!

记住,不理解时候,去尝试手动展开!

记住,逻辑展开(你不可能对所有的题目都进行手动展开)!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值