題目地址:
https://leetcode.com/problems/letter-case-permutation/
給定一個字符串,允許將其中的字母大小寫變換。返回所有可能性。
思路是DFS。遇到字母時,枚舉其爲小寫和大寫兩種情況,得到所有可能性等價於在一棵二叉樹上進行遍歷,只需要記得回溯的時候要恢復現場即可。想象是樹根,變更其第一個英文字母后進入遞歸下一層,嘗試變更之後的英文字母,遍歷的時候把沿途經過的所有字符串加入最終結果;在遞歸結束的時候回溯到上一層節點,此時要把當初變更的字母再變回來,保持搜索樹沒有發生變化。代碼如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<String> letterCasePermutation(String S) {
List<String> res = new ArrayList<>();
dfs(S.toCharArray(), 0, res);
return res;
}
// 從s[pos]開始枚舉每個字母的大小寫兩個情況
private void dfs(char[] s, int pos, List<String> res) {
// 這裏採用先序遍歷,一進入樹的節點就加入res
res.add(new String(s));
for (int i = pos; i < s.length; i++) {
if (!Character.isLetter(s[i])) {
continue;
}
char ch = s[i];
// 如果當前字母是大寫,則將其變爲小寫,再進入下一層遞歸;如果當前字母是小寫,也類似操作
if (Character.isUpperCase(ch)) {
s[i] = Character.toLowerCase(ch);
dfs(s, i + 1, res);
s[i] = ch;
} else {
s[i] = Character.toUpperCase(ch);
dfs(s, i + 1, res);
s[i] = ch;
}
}
}
}
時間複雜度,空間(遞歸棧深度取決於字符串中的英文字母數量,另外char數組也要佔用空間)。