題目地址:
https://www.lintcode.com/problem/letter-case-permutation/description
給定一個字符串,允許將其中的英文字母變換大小寫。要求返回變換產生的所有可能性。
本質上是遍歷二叉樹,可以採用DFS。用一個StringBuilder保存已經產生的字符串片段,然後枚舉每個英文字母是大寫還是小寫。注意回溯的時候要恢復現場。代碼如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
/**
* @param S: a string
* @return: return a list of strings
*/
public List<String> letterCasePermutation(String S) {
// write your code here
List<String> res = new ArrayList<>();
dfs(S, 0, new StringBuilder(), res);
return res;
}
// 從s[pos]開始枚舉s[pos]是非英文字母,還是大寫,還是小寫
private void dfs(String s, int pos, StringBuilder sb, List<String> res) {
if (pos == s.length()) {
res.add(sb.toString());
return;
}
// 如果s[pos]非英文字母,則直接append到sb後面,進入下一個位置進行枚舉;
// 如果是英文字母,則枚舉append其小寫以及大寫,分別進入下一層遞歸枚舉;
// 每次遞歸結束就返回了遞歸樹的上一層節點,需要把sb也恢復原狀
if (!Character.isLetter(s.charAt(pos))) {
sb.append(s.charAt(pos));
dfs(s, pos + 1, sb, res);
sb.setLength(sb.length() - 1);
} else {
sb.append(Character.toLowerCase(s.charAt(pos)));
dfs(s, pos + 1, sb, res);
sb.setLength(sb.length() - 1);
sb.append(Character.toUpperCase(s.charAt(pos)));
dfs(s, pos + 1, sb, res);
sb.setLength(sb.length() - 1);
}
}
}
時間複雜度,空間。