字母大小写全排列>>>
- 这一类搜索问题是在一颗隐式树上进行搜索的问题,即
树形问题
.因此,先画出递归树是十分重要的,然后看着图形把代码写出来 - 问题所求的解,就是这颗树的叶子节点的值,因此,可以使用深度优先遍历,得到叶子节点的值,这样的算法也叫回溯算法
- 回溯算法的显著特征是
状态重置
,而由于字符串在拼接过程中,每次都产生新字符串,因此,在叶子节点处,直接保存即可
package BDyNamicProgramming;
import java.util.ArrayList;
import java.util.List;
public class Problem784 {
public List<String> letterCasePermutation(String S) {
List<String> rs = new ArrayList<>();
dfs(S,0,rs,new StringBuilder());
return rs;
}
public void dfs(String S,int start,List<String> rs,StringBuilder sb){
if(start==S.length()){
rs.add(sb.toString());
return;
}
if(S.charAt(start)>=65&&S.charAt(start)<=122){
sb.append((S.charAt(start)+"").toLowerCase());
dfs(S,start+1,rs,sb);
sb.deleteCharAt(sb.length()-1);
sb.append((S.charAt(start)+"").toUpperCase());
dfs(S,start+1,rs,sb);
sb.deleteCharAt(sb.length()-1);
} else{
sb.append(S.charAt(start));
dfs(S,start+1,rs,sb);
sb.deleteCharAt(sb.length()-1);
}
}
public static void main(String[] args) {
String s = "a1";
Problem784 problem784 = new Problem784();
List<String> list = problem784.letterCasePermutation(s);
System.out.println(list);
}
}