力扣784(java)-字母大小写全排列(中等)
题目:
给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。
返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
示例 1:
输入:s = "a1b2"
输出:["a1b2", "a1B2", "A1b2", "A1B2"]
示例 2:
输入: s = "3z4"
输出: ["3z4","3Z4"]
提示:
- 1 <= s.length <= 12
- s 由小写英文字母、大写英文字母和数字组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/letter-case-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
一、用List模拟
有思路,但是写不出来完整的代码
参考@【爪哇缪斯】:https://leetcode.cn/problems/letter-case-permutation/solution/zhua-wa-mou-si-by-muse-77-7jb8/
首先将原字符串 s 放进结果ans中,然后再从头开始遍历字符串 s :
- 当发现下标为 i 处是数字时,就跳过;
- 当发现下标为 i 处是英文字母时,就进行大小写的转换,将本次转换后的整个字符串加入到ans中。
直到i 到达字符串的末尾表示字符串 s 遍历完成,返回ans。结合图进行理解。


java代码:
1 class Solution {
2 public List<String> letterCasePermutation(String s) {
3 List<String> ans = new ArrayList<>();
4 //先将原字符串添加进结果中
5 ans.add(s);
6 //外层循环控制遍历的字符下标
7 for(int i = 0; i < s.length(); i++){
8 //如果是数字就跳过
9 if(s.charAt(i) < 'A') continue;
10 int n = ans.size();
11 //内层循环控制改变的字符串下标
12 for(int j = 0; j < n; j++){
13 char[] cs = ans.get(j).toCharArray();
14 //直接定位在是字符的下标进行大小写转换
15 //将小写转换成大写
16 if(cs[i] >= 'a'){
17 cs[i] = (char)(cs[i] - 32);
18 }else{
19 //将大写转换成小写
20 cs[i] = (char)(cs[i] + 32);
21 }
22 //将本次转换后的字符串加入到结果中
23 ans.add(new String(cs));
24 }
25 }
26 return ans;
27 }
28 }

二、DFS
设计DFS函数为void dfs(char[] cs, List<String> ans, int index),cs为原来字符串s转换成字符数组,ans为当前具体的字符串,index表示当前处理到的字符位置。从前往后遍历每个cs[index],根据cs[index]是否为字母具体讨论:
- 若cs[index]不是字母,则保留,不做任何改变,继续dfs下一个位置 index +1;
- 若cs[index]是字母,则保留原有字母或改变大小写,然后继续dfs下一个位置 index + 1。
当index == n时,说明对原字符串的每一个位置都已经变换完成,直接将当前cs加入到ans中。
注意:
异或:相同为0,不同为1
A 的Ascii 值为65(十进制) 二进制为 01000010
Z 的Ascii 值为90(十进制) 二进制为 01011010
32的二进制值为 00100000
所以可以从大写转小写,从小转大异或运算32,去掉1 也就可以了
举例:
1.c(99):1100011转换成大写,与32(00100000)异或为:1000011(67)为C
2.M(77):01001101转换成小写,与32(00100000)异或为:01101101(109)为m
java代码:
1 class Solution {
2 public List<String> letterCasePermutation(String s) {
3 List<String> ans = new ArrayList<>();
4 char[] cs = s.toCharArray();
5 dfs(cs, ans, 0);
6 return ans;
7 }
8 public void dfs(char[] cs, List<String> ans, int index){
9 if(index == cs.length){
10 ans.add(new String(cs));
11 return;
12 }
13 //不做任何改变继续dfs
14 dfs(cs, ans, index + 1);
15 //改变字母大小写状态
16 if(Character.isLetter(cs[index])){
17 cs[index] ^= 32;
18 dfs(cs, ans, index + 1);
19 }
20 }
21 }

力扣784(java)-字母大小写全排列(中等)的更多相关文章
- Java实现 LeetCode 784 字母大小写全排列(DFS)
784. 字母大小写全排列 给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串.返回所有可能得到的字符串集合. 示例: 输入: S = "a1b2" ...
- [LeetCode] 784. 字母大小写全排列 ☆☆☆(回溯、深度优先遍历)
https://leetcode-cn.com/problems/letter-case-permutation/solution/shen-du-you-xian-bian-li-hui-su-su ...
- 领扣(LeetCode)字母大小写全排列 个人题解
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串.返回所有可能得到的字符串集合. 示例: 输入: S = "a1b2" 输出: ["a1 ...
- 784. Letter Case Permutation C++字母大小写全排列
网址:https://leetcode.com/problems/letter-case-permutation/ basic backtracking class Solution { public ...
- [LeetCode] Letter Case Permutation 字母大小写全排列
Given a string S, we can transform every letter individually to be lowercase or uppercase to create ...
- [Swift]LeetCode784. 字母大小写全排列 | Letter Case Permutation
Given a string S, we can transform every letter individually to be lowercase or uppercase to create ...
- Leetcode784.Letter Case Permutation字母大小写全排列
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串.返回所有可能得到的字符串集合. 示例: 输入: S = "a1b2" 输出: ["a1 ...
- Java对字母大小写转换
Java对字母大小写转换 1.小写——大写String aa = "abc".toUpperCase(); 2.大写——小写 String bb = "ABC" ...
- java string 首字母大小写方法
String字符串需要进行首字母大小写改写,查询google,就是将首字母截取,转化大小写 + 首字母后面字符串 //首字母小写 public static String captureName(St ...
- 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题
题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...
随机推荐
- dbvisualizer之编辑区中文乱码问题
!在SQL Commander中,sql语句中如果有中文,显示是'口口口'. 解决办法如下: 在Tools->tool Properties->General->Appearance ...
- 12_采样格式&音频重采样
采样格式 通过前面学习我们知道FFmpeg和SDL都有自己的采样格式的表达式,那么他们都表示什么意思呢? FFmpeg的采样格式的表达式: enum AVCodecID { ...... AV_COD ...
- CSS(三大特性、盒子模型的组成(boder、padding、margin)、ps基本操作)
一.css三大特性 1.层叠性 相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式.层叠性主要解决样式冲突的问题 层叠性原则: 样式冲突,遵循的原则是就近原则,哪个样式离结构近, ...
- Three.js的基础使用
1. 引言 Three.js是著名的JavaScript 3D图形库,用于浏览器中开发 3D 交互场景的 JS 引擎,可以快速的搭建三维场景 Three.js官网为:创建一个场景 – three.js ...
- Vite+TS项目:论如何便捷的使用pinia
这里给大家分享我在网上学习总结出来的一些知识,希望对大家有所帮助 pinia 介绍 vue新一代状态管理库,相当于vuex 特性 1.像定义components一样定义store 2.支持ts 3.去 ...
- cmake:针对某些依赖 openssl-1.0 而机器上还有其他版本的 openssl
指定下列变量: -DOPENSSL_INCLUDE_DIR:指向 openssl-1.0 的 include 目录 -DOPENSSL_SSL_LIBRARIES:指向 openssl-1.0 的 l ...
- 重返ubuntu世界
一直对"重返"两个字充满了情怀感,因为会想起小时候看的一本龙珠同人的标题,它就唤作<重回龙珠世界>.最近这五年基本都是在MacOS下工作和学习的,也习惯用MacOS.就 ...
- AI实用指南:5分钟搭建你自己的LLM聊天应用
今天,我们将迅速着手搭建一个高效且富有创意的混元聊天应用,其核心理念可以用一个字来概括--快.在这个快节奏的时代,构建一个基础的LLM(Large Language Model,大型语言模型)聊天应用 ...
- AXI-自定义IP-PS设计
基于AXI4的自定义IP核的设计 1.实验目标 利用vivado中内置的AXI总线初始化的IP核设计工具,将自己设计的流水灯的PL代码打包成IP核外设,挂在PS上,通过PS上的按钮控制流水灯的开始和结 ...
- KingbaseESV8R6延迟提交参数
前言 队列理论在我们生活中的应用随处可见,例如我们去食堂打饭需要排队,我们生活中随处可见排队的场景. 在计算机领域中,性能诊断等地方使用队列理论的案例也很多.服务器硬件分为动态设备和静态设备.CPU和 ...