• [leetCode]784. 字母大小写全排列


    在这里插入图片描述

    递归

    遍历字符串S中的字符,如果是字母则将之前的全排列复制一份,并添加当前字母的大小写,如果不是字母则直接添加该字符

    class Solution {
        public List<String> letterCasePermutation(String S) {
            List<StringBuffer> ans = new ArrayList<>();
            ans.add(new StringBuffer());
            for (char c : S.toCharArray()) {
                int n = ans.size();
                if (Character.isLetter(c)) {
                    for (int i = 0; i < n; i++) {
                        ans.add(new StringBuffer(ans.get(i)));
                        ans.get(i).append(Character.toUpperCase(c));
                        ans.get(i + n).append(Character.toLowerCase(c));
                    }
                } else {
                    for (int i = 0; i < n; i++)
                        ans.get(i).append(c);
                }
            }
            List<String> finalans = new ArrayList<>();
            for (StringBuffer sb : ans) {
                finalans.add(sb.toString());
            }
            return finalans;
        }
    }
    

    位掩码

    一个字符串中有B个字符为字母哪么就有 2 B 2^B 2B种排列,可以使用位掩码唯一的表示。比如说字符串ab的全排列:
    ab -> 00
    aB -> 01
    Ab -> 10
    AB -> 11

    class Solution {
    
        public List<String> letterCasePermutation(String S) {
            // 统计字符串有几个字符是字母
            int B = 0;
            for (char c : S.toCharArray()) {
                if (Character.isLetter(c)) 
                    B++;
            }
            List<String> ans = new ArrayList<>();
            // 一共有 2^B 个排列
            for (int bit = 0; bit < 1 << B; bit++) {
                int b = 0;
                StringBuffer words = new StringBuffer(); 
                for (char c : S.toCharArray()) {
                    if (Character.isLetter(c)) {
                        if (((bit >> b++) & 1) == 1) {
                            words.append(Character.toLowerCase(c));
                        } else {
                            words.append(Character.toUpperCase(c));
                        }
                    } else {
                        words.append(c);
                    }
                }
                ans.add(words.toString());
            }
            return ans;
        }
    }
    
  • 相关阅读:
    【Java8】 @FunctionalInterface 函数式接口
    集合使用copy与mutableCopy的区别
    GCD中的dispatch_sync、dispatch_sync 分别与串行、并行队列组合执行小实验
    podspec文件介绍
    iOS系统app崩溃日志手动符号化
    webView文本长按显示英文
    深拷贝
    view向全屏延伸时的属性设置
    iOS 模拟器截屏快捷键
    mysql 优化常用语句
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13859901.html
Copyright © 2020-2023  润新知