题目:
给定一个字符串S
,通过将字符串S
中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
示例: 输入: S = "a1b2" 输出: ["a1b2", "a1B2", "A1b2", "A1B2"] 输入: S = "3z4" 输出: ["3z4", "3Z4"] 输入: S = "12345" 输出: ["12345"]
注意:
S
的长度不超过12
。S
仅由数字和字母组成。
解题思路:
回溯法求解,数字跳过。
时间复杂度O(n!),空间复杂度O(n)。
代码实现:
class Solution { public List<String> letterCasePermutation(String S) { List<String> result = new ArrayList<String>(); int scale = 0, maxScale = S.length(); int[] choice = new int[maxScale]; char[] chs = S.toCharArray(); // 终止条件:问题规模边界为负 while (scale >= 0) { // 输出条件:问题规模边界为最大边界 if (scale == maxScale) { result.add(new String(chs)); scale --; continue; } if (chs[scale] <= '9') { if (choice[scale] == 0) choice[scale ++] = 1; else choice[scale --] = 0; continue; } if (choice[scale] == 0) { chs[scale] = Character.toLowerCase(chs[scale]); choice[scale] ++; scale ++; } else if (choice[scale] == 1) { chs[scale] = Character.toUpperCase(chs[scale]); choice[scale] ++; scale ++; } else { choice[scale] = 0; scale --; } } return result; } }