题目:

给定一个字符串 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. day12-面向对象03

    面向对象03 10.抽象类 abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法:如果修饰类,那么该类就是抽象类 抽象类中可以没有抽象方法,但是有抽象方法的类一定要 ...

  2. 使用ConnectivityManager.bindProcessToNetwork绑定特殊网络

    最近测试那边提了一个bug,经过排查后发现其原因:是因为连接的Wi-Fi无法上网,因此在Android系统的多网络策略中,可以上网的SIM移动网络被设置为系统默认网络,投屏组件docker传输与反控模 ...

  3. 什么会导致JAVA应用程序的CPU使用率飙升

    问题 无限循环的while会导致CPU使用率飙升吗? 经常使用Young GC会导致CPU占用率飙升吗? 具有大量线程的应用程序的CPU使用率是否较高? CPU使用率高的应用程序的线程数是多少? 处于 ...

  4. 巧用Maya轴心操作小技巧,工作事半功倍!

    Maya 是一款专业的三维软件,可以用于创建规模宏大的世界.复杂的角色和炫酷的特效.Maya的用户遍布动画行业.影视特效.广告和片头.平面设计行业,用户数量十分庞大.本文分享了maya轴心操作的小技巧 ...

  5. openlayers操作分享:如何从容的在vue中食用openlayers6

    这篇文章,分享下我对openlayers的一些经验和理解,会夹杂大量搜索出来得文档,是我正式使用时可以实现的,废话不多说,我们从下载开始 一,openlayers安装且初始化地图 创建vue项目就省略 ...

  6. 记录--没有await,如何处理“回调地狱”

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 太长不看 不要嵌套使用函数.给每个函数命名并把他们放在你代码的顶层 利用函数提升.先使用后声明. 处理每一个异常 编写可以复用的函数,并把 ...

  7. 记录--a标签跳转新地址无法访问,但手动输入新地址可以访问

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 问题描述 最近遇到一个有意思的问题,项目中有一个地方,点击需要跳转到一个新的域名地址 笔者使用a标签做跳转,跳是跳过去了,可是跳过去以后, ...

  8. 基础教材系列:编译原理——B站笔记

    一.编译器是什么 源程序→预处理器→经过预处理的源程序→编译器→汇编语言程序→汇编器→可重定位的机器代码→链接器/加载器→目标机器代码. 编译器的结构: 与源语言相关:字符流→词法分析器→词法单元流→ ...

  9. 如何使用文件传输协议ftp,教你使用文件传输协议命令行

    FTP是文件传输协议的缩写.顾名思义,FTP用于在网络上的计算机之间传输文件.您可以使用文件传输协议在计算机帐户之间交换文件,在帐户和台式计算机之间传输文件或访问在线软件档案.但是请记住,许多文件传输 ...

  10. AXI4的IP的输入配置

    AXI4的IP的输入配置 1.实验原理 前面一篇验证中验证了AXI中的data_reg_out是输出缓存器.这里再引入一个slv_reg2作为slv-_reg1的输入输出配置寄存器.这里先实现一个简单 ...