题目链接
字母大小写全排列
题目描述
给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。
返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
题目示例
输入:s = “a1b2”
输出:[“a1b2”, “a1B2”, “A1b2”, “A1B2”]
输入: s = “3z4”
输出: [“3z4”,“3Z4”]
题目提示
- 1 <= s.length <= 12
- s 由小写英文字母、大写英文字母和数字组成
解题思路
由于每一个字母都有大小写两种格式:
包含1个字母的字符串有2种字符串集合
包含2个字母的字符串有4种字符串集合
包含3个字母的字符串有8种字符串集合
包含n个字母的字符串有2^n种字符串集合
我们先遍历字符串,统计字母个数,构造一个等长的整形数组,如果字符串中有3个字母,那么就构造一个长度为3的整形数组
由于字母只有大写和小写两种不同的状态,因此可以使用0代表大写,1代表小写
例如字符串是a1bc,如果数组是001,那么结果字符串就是A1Bc
我们知道
十进制的0对应二进制的000,十进制的7对应二进制的111,因此如果字符串中有三个字母,我们只需要按照十进制的从0到2^3 - 1来进行二进制位的一位一位比较,如果是0就拼接大写字母,如果是1就拼接小写字母
代码
class Solution {
public List<String> letterCasePermutation(String s) {
int count = 0;
List<String> list = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
if(Character.isLetter(s.charAt(i))) {
count++;
}
}
count = (1 << count);
for (int i = 0; i < count; i++) {
StringBuffer stringBuffer = new StringBuffer();
for (int j = 0, k = 0; j < s.length(); j++) {
if(Character.isLetter(s.charAt(j))){
if(((1 << k) & i) != 0){
stringBuffer.append(s.toLowerCase().charAt(j));
} else {
stringBuffer.append(s.toUpperCase().charAt(j));
}
k++;
} else {
stringBuffer.append(s.charAt(j));
}
}
list.add(stringBuffer.toString());
}
return list;
}
}