问题描述:
给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
样例如下:
代码及思路如下:(采用回溯法)
import java.util.ArrayList;
import java.util.List;
//给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。
//返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
public class LetterCasePermutation {
//采用递归+回溯法
//组合或者集合,马上想到可以用回溯法:回溯法本来是说对于每个元素都先考虑放它的情况,再考虑不放它的情况;
// 放在这道题的背景里就是,对于每个字母,先考虑放它,再考虑放它的另一种大小写形式。
public static List<String> letterCasePermutation(String s) {
List<String> ans = new ArrayList<>();
dfs(s.toCharArray(), 0, ans);
return ans;
}
public static void dfs(char[] arr, int pos, List<String> res) {
while (pos < arr.length && Character.isDigit(arr[pos])) {//寻找第一个为字母的下标
pos++;
}
if (pos == arr.length) {//递归出口
res.add(new String(arr));
return;
}
arr[pos] ^= 32;//大小写变换,使用异或32
dfs(arr, pos + 1, res);
arr[pos] ^= 32;//回溯
dfs(arr, pos + 1, res);
}
public static void main(String[] args) {
String s = "a1b2";
List<String> res = letterCasePermutation(s);
System.out.println(res);
String s1 = "3z4";
List<String> res1 = letterCasePermutation(s1);
System.out.println(res1);
}
}
结果如下: