解题思路:这个题看起来不难,但是想写的比较简单就比较麻烦,晚上想了下觉得还是用位向量比较直观。先统计所有小写字母的位置,假设有n个小写字母,则有2^n种不同的字符串。取一个位向量,1表示这一个位置的字母是大写,0表示是小写。(例如:5表示为101则第0位和第2位的字母大写,其他小写),其他详见代码
class Solution {
public List<String> letterCasePermutation(String S) {
List<String> list = new ArrayList<>();
if(S == null){
return list;
}
//这个坑爹测试点
if(S.length() == 0){
list.add(S);
return list;
}
char[] source = S.toCharArray();
List<Integer> posList = new ArrayList<>();
for (int i = 0; i < source.length; i++) {
if(source[i] > '9'){
//记录每个字母的位置
posList.add(i);
}
}
int cnt = 1 << (posList.size());
for(int i = 0; i < cnt; i++){
int temp = i;
for(int j = 0; j < posList.size(); j++){
//1把字母转为大写,0转为小写
if((temp & 1) == 1){
source[posList.get(j)] = Character.toUpperCase(source[posList.get(j)]);
} else{
source[posList.get(j)] = Character.toLowerCase(source[posList.get(j)]);
}
temp >>= 1;
}
//通过char[]直接转换为String
list.add(String.valueOf(source));
}
return list;
}
}