题目:

给定一个字符串 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)-字母大小写全排列(中等)的更多相关文章

  1. Java实现 LeetCode 784 字母大小写全排列(DFS)

    784. 字母大小写全排列 给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串.返回所有可能得到的字符串集合. 示例: 输入: S = "a1b2" ...

  2. [LeetCode] 784. 字母大小写全排列 ☆☆☆(回溯、深度优先遍历)

    https://leetcode-cn.com/problems/letter-case-permutation/solution/shen-du-you-xian-bian-li-hui-su-su ...

  3. 领扣(LeetCode)字母大小写全排列 个人题解

    给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串.返回所有可能得到的字符串集合. 示例: 输入: S = "a1b2" 输出: ["a1 ...

  4. 784. Letter Case Permutation C++字母大小写全排列

    网址:https://leetcode.com/problems/letter-case-permutation/ basic backtracking class Solution { public ...

  5. [LeetCode] Letter Case Permutation 字母大小写全排列

    Given a string S, we can transform every letter individually to be lowercase or uppercase to create ...

  6. [Swift]LeetCode784. 字母大小写全排列 | Letter Case Permutation

    Given a string S, we can transform every letter individually to be lowercase or uppercase to create ...

  7. Leetcode784.Letter Case Permutation字母大小写全排列

    给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串.返回所有可能得到的字符串集合. 示例: 输入: S = "a1b2" 输出: ["a1 ...

  8. Java对字母大小写转换

    Java对字母大小写转换 1.小写——大写String aa = "abc".toUpperCase(); 2.大写——小写 String bb = "ABC" ...

  9. java string 首字母大小写方法

    String字符串需要进行首字母大小写改写,查询google,就是将首字母截取,转化大小写 + 首字母后面字符串 //首字母小写 public static String captureName(St ...

  10. 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题

    题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...

随机推荐

  1. day01-2-@RequestMapping和Rest

    @RequestMapping和Rest 1.@RequestMapping 1.1基本使用 @RequestMapping注解可以指定 控制器(处理器) 的某个方法的请求url 1.2@Reques ...

  2. day07-JavaScript04

    JavaScript04 11.DOM02 11.3HTML-DOM文档说明 11.3.1基本介绍 在HTML DOM(文档对象模型)中,每个部分都是节点: 1)文档本身是文档节点 2)所有HTML元 ...

  3. cpprestsdk有bug.

    好不容易将cpprestsdk移植到MinGW,并编译通过,出于安全还是先将samples还有tests测试一下是否正常. 用samples/blackjack一测试就出现奇葩现象,server一端会 ...

  4. 怎样给U盘加密

    给U盘加密其实很简单,下载一个叫U盘超级加密3000的U盘加密软件就可以了. 这款U盘加密的软件最大的特点是不用安装,只要一个exe文件.你把它放到你需要加密的U盘里,就可以加密U盘里的数据了.并且到 ...

  5. 【atcoder 293 E - Sugoroku 4】【动态规划,递推】

    import java.io.IOException; import java.util.Arrays; import java.util.Scanner; public class Main { s ...

  6. MYSQL 同步到ES 如何设计架构保持一致性

    简单使用某个组件很容易,但是一旦要搬到生产上就要考虑各种各样的异常,保证你方案的可靠性,可恢复性就是我们需要思考的问题.今天来聊聊我们部门在 MYSQL 同步到ES的方案设计. 在面对复杂条件查询时, ...

  7. vue项目nginx部署二级目录

    一.修改router.js中添加base根目录配置 const vueRouter = new Router({ mode: 'history', base: 'app', 二.修改vue.confi ...

  8. 数字电路之MOS设计

    数字电路之MOS设计 1.MOS的基本性质 MOS,即场效应管,四端器件,S.D.G.B四个端口可以实现开和关的逻辑状态,进而实现基本的逻辑门.NMOS和PMOS具有明显的对偶特性:NMOS高电平打开 ...

  9. Docker技术全景:推动云原生架构的关键力量

    本文深入探讨了Docker的发展历程.核心技术.在云服务中的应用以及其庞大生态系统.通过分析Docker如何革新容器化技术.加速云服务的发展,并构建一个多元化的生态系统,本文揭示了Docker在当代云 ...

  10. yml和properties打印SQL日志信息

    1.配置文件里面配置 第一种是properties类型如下 logging.level.com.datayes.mdi.dao.rdb.mommp.**=debug其中 com.datayes.mdi ...