2025年--Lc293-784. 字母大小写全排列(回溯)--java版

1.题目

2.思路

深度优先遍历(回溯)



补充:大小写字符转换

charArrayindex ^= 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);
        }
    }
}
相关推荐
一水鉴天2 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel2 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
Wang's Blog3 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
2601_962071573 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
\光辉岁月/4 小时前
5.java-数组
java·开发语言
Java后端的Ai之路4 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
谢亮_vipxieliang5 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
时间的拾荒人5 小时前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试
郑州光合科技余经理5 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071575 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm