原题链接:
解题思路:这个题看起来不难,但是想写的比较简单就比较麻烦,晚上想了下觉得还是用位向量比较直观。先统计所有小写字母的位置,假设有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; } }