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);
        }
    }
}
相关推荐
用户298698530142 小时前
Word 文档字符级格式化:Java 实现方案详解
java·后端
笨鸟飞不快2 小时前
从单个服务到集群:一次完整的性能排查复盘
java·前端
荣码2 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
SamDeepThinking2 小时前
Java微服务练习方式
java·后端·微服务
朦胧之13 小时前
AI 编程-老项目改造篇
java·前端·后端
程序猿大帅17 小时前
别再只当调包侠了:用 Spring AI 落地 Function Calling,我被大模型硬生生砸出了三个大坑
java
程序员晓琪18 小时前
约定大于配置:基于 Java 包名自动生成 API 版本路由的最佳实践
java·spring boot·后端
Flittly18 小时前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
众少成多积小致巨19 小时前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
东坡白菜19 小时前
破局全栈:前端开发的Java入门实战记录—JPA(2)
java·后端