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

描述

给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。

示例:
输入: S = "a1b2"
输出: ["a1b2", "a1B2", "A1b2", "A1B2"]

输入: S = "3z4"
输出: ["3z4", "3Z4"]

输入: S = "12345"
输出: ["12345"]
注意:

S 的长度不超过12。
S 仅由数字和字母组成。

解析

明显的回溯。有字母的char,有2个分支。

可以想象为二叉树,深度优先遍历每一颗子树。

技巧:大小写字母转换

使用异或运算转换字母大小写。

我们发现大写字符与其对应的小写字符的 ASCII 的差为 32,32 这个值如果敏感的话,它是 2^5
,在编程语言中,可以表示为 1 << 5。而

变换大小写这件事等价于:

1、如果字符是小写字符,减去 32 得到大写字符;
2、如果字符是大写字符,加上 32 得到小写字符。

而这两者合并起来,就是给这个字符做一次不进位的加法,即异或上 1 << 5。

代码

  1. class Solution {
  2. public List<String> letterCasePermutation(String S) {
  3. List<String> list = new ArrayList<>();
  4. if (S == null || S.length() <= 0) {
  5. return list;
  6. }
  7. // letterCasePermutation(S, "", list, 0);
  8. letterCasePermutation1(S.toCharArray(), list, 0);
  9. return list;
  10. }
  11. //只有2个分支,判断一下
  12. public static void letterCasePermutation1(char[] chars, List<String> list, int start) {
  13. if (start == chars.length) {
  14. list.add(new String(chars));
  15. return;
  16. }
  17. letterCasePermutation1(chars, list, start + 1);
  18. if (Character.isLetter(chars[start])) {
  19. chars[start] ^= (1 << 5);
  20. letterCasePermutation1(chars, list, start + 1);
  21. }
  22. }
  23. //me
  24. public void letterCasePermutation(String S, String tempStr, List<String> list, int start) {
  25. if (start == S.length() && tempStr.length() == S.length()) {
  26. list.add(tempStr);
  27. }
  28. for (int i = start; i < S.length(); i++) {
  29. char curChar = S.charAt(i);
  30. if (curChar >= 48 && curChar <= 57) {
  31. tempStr += curChar;
  32. start++;
  33. } else {
  34. for (int k = 0; k < 2; k++) {
  35. if (k == 0) {
  36. tempStr += String.valueOf(curChar).toLowerCase();
  37. } else {
  38. tempStr += String.valueOf(curChar).toUpperCase();
  39. }
  40. letterCasePermutation(S, tempStr, list, i + 1);
  41. tempStr = tempStr.substring(0, tempStr.length() - 1);
  42. }
  43. }
  44.  
  45. if (start == S.length() && tempStr.length() == S.length()) {
  46. list.add(tempStr);
  47. }
  48. }
  49. }
  50. }

[LeetCode] 784. 字母大小写全排列 ☆☆☆(回溯、深度优先遍历)的更多相关文章

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

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

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

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

  3. Leetcode题目46.全排列(回溯+深度优先遍历+状态重置-中等)

    题目描述: 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], ...

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

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

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

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

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

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

  7. [LeetCode] 46. Int数组全排列 ☆☆☆(回溯)

    描述 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2, ...

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

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

  9. [LeetCode] 17. 电话号码的字母组合 ☆☆☆(回溯) ###

    描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23"输出:[&q ...

随机推荐

  1. 置BAT批处理窗口显示颜色

    置BAT批处理窗口显示颜色 摘自:https://blog.csdn.net/tp7309/article/details/53450131 2016年12月04日 01:08:33 亦游 阅读数:1 ...

  2. PHP重建数组的索引

    sort() array_merge()跟一个空数组合并都可以重建索引数组的键(key)

  3. 第二十三章 多项目集中权限管理及分布式会话——《跟我学Shiro》

    二十三章 多项目集中权限管理及分布式会话——<跟我学Shiro> 博客分类: 跟我学Shiro 跟我学Shiro  目录贴:跟我学Shiro目录贴 在做一些企业内部项目时或一些互联网后台时 ...

  4. 跟我学Shiro目录贴

    转发地址:https://www.iteye.com/blog/jinnianshilongnian-2018398 扫一扫,关注我的公众号 购买地址 历经三个月左右时间,<跟我学Shiro&g ...

  5. python:python2与python3共存时,pip冲突,提示Fatal error in launcher: Unable to create process using '"d:\python27\python2.exe" "D:\Python27\Scripts\pip2.exe" '

    问题背景: 机器上同时装了python2.和python3后,导致只能用pip3了,使用pip2时提示:Fatal error in launcher: Unable to create proces ...

  6. 要开始恶补Layer4-7 TCP/IP相关的姿势了,今天立个Flag

    今天开区域销售会,被老板K了一顿大的!(:/手动委屈:) 说产品出来这么久,怎么没看到你们的跟接触客户的使用报告记录,一年快到头了,试用客户才个位数?你们了解自己的产品吗,然后轮着上去一个个做功能演示 ...

  7. 前端添加视频流rtmp格式

    要求:rtmp格式, 在线直播 url地址 效果: 代码:初次打开时间较长, <!DOCTYPE html> <html> <head> <script ty ...

  8. vue的依赖注入provide和inject

    一.解决的场景问题: 根父组件A有一个方法getMap,该组件A下的所有子组件B,子组件C,子组件D,或者子组件B下的子组件E等层层嵌套情况下,在某种情况下,都需要访问父组件的getMap方法,那么常 ...

  9. wxPython之BoxSizer

    1 函数原型 sizer = wx.BoxSizer( integer orient ) 其中的方向(orient)可以是 wx.VERTICAL(垂直) 或 wx.HORIZONTAL(水平). 将 ...

  10. 在airflow的BashOperator中执行docker容器中的脚本容易忽略的问题

    dag模板 from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow. ...