题目:

给定一个字符串 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. java基本数据类型及运算的注意事项

    java基本数据类型及运算的注意事项 一.基本数据类型 序号 类型 位数 范围 说明 整数类型 (最高位为符号位) byte 8位 -128(-27)~127(27-1) 默认类型为int 二进制0b ...

  2. 【开源库推荐】#1 SpiderMan 可快速查看Android闪退崩溃日志

    原文:https://stars-one.site/2020/12/22/android-log-spiderman 开发Android的时候想必大家都遭受过这种经历: 用户手机上App闪退了,但是我 ...

  3. 记本地新建一个gradle方式springboot项目过程

    打算使用gradle在idea新建个springboot项目,然后坑很多,记录一下 原来我的idea应该是社区版,新建项目时候没有可以选择spring相关配置,然后卸载了重装,之前问题是启动是启动起来 ...

  4. Tomcat错误之java.lang.OutOfMemoryError:PermGen space解决方案

    公司的站点是跑在Tomcat环境下的,运行一段时间后,有时会报这样的错误:java.lang.OutOfMemoryError: PermGen space 在网上查询了一下,大部分都说是jvm虚拟机 ...

  5. Django_文件下载

    一.小文件下载 1.视图 views.py 三种方式实现,任选其一 (1)使用HttpResponse # 导入模块from django.shortcuts import HttpResponse ...

  6. PAT 甲级【1012 The Best Rank】

    本题用java极容易超时,提交了好几次才成功 另外90 88 77 77 50,名次应该是1 2 3 3 5 ,不是1 2 3 3 4 import java.io.*; public class M ...

  7. AntvG6-graph图谱工具

    1 快速上手 1.1 在项目中使用 npm 包引入 Step 1: 使用命令行在项目目录下执行以下命令 npm install --save @antv/g6 Step 2: 在需要用的 G6 的 J ...

  8. java读写txt

    /** * 传入txt路径读取txt文件 * * @param txtPath * @return 返回读取到的内容 */ public String readTxt(String txtPath) ...

  9. 可变形卷积系列(三) Deformable Kernels,创意满满的可变形卷积核 | ICLR 2020

    论文提出可变形卷积核(DK)来自适应有效感受域,每次进行卷积操作时都从原卷积中采样出新卷积,是一种新颖的可变形卷积的形式,从实验来看,是之前方法的一种有力的补充.   来源:晓飞的算法工程笔记 公众号 ...

  10. 并发框架 LMAX Disruptor

    Introduction   Michael Barker edited this page on 2 Mar 2015 · 8 revisions The best way to understan ...