784.字母大小写全排列 力扣
我的结果
求解思路
-
这也是一个典型的回溯问题,dfs就可以解决。
-
之前做过dfs的类型题,大体思路一样,重在细节,和编程的灵活性
-
由于遍历的元素是基本类型,所以path(搜索路径)用char[]表示,这样不涉及入栈出栈了,遍历完不用考虑更新,直接在原来数组上赋值即可
-
对比之前的题里for循环里嵌套递龟函数,这道题每层只有两个选择,且大小不变,故可以不用for来处理,写两个条件,这两个条件顺序执行,每个条件里放入递龟函数。
///原来的框架 bfs( ){ //终止条件 if(){ return; } for( ){ bfs( ) } } ///这道题完全可以这样 bfs(){ //终止条件 if(){} //统统写成大写 bfs(); //统统写成小写 bfs(); }
代码
class Solution {
List<String> ans = new ArrayList<>();
int dis = 'a'-'A';
public List<String> letterCasePermutation(String s) {
char[] path = new char[s.length()];
char[] array = s.toCharArray();
int len = array.length;
dfs(0,array,len,path);
return ans;
}
void dfs(int depth, char[] array,int len,char[] path){
//是数字就往前,但是要注意++操作会让数组越界
while(depth!=len&&array[depth]<='9'&&array[depth]>='0'){path[depth] = array[depth];depth++;}
//循环终止条件
if(depth==len){ans.add(new String(path));return;}
//统统变成大写
if(array[depth]>='A'&&array[depth]<='Z'){path[depth]=array[depth];}
else{path[depth] = (char)(array[depth]-dis);}
dfs(depth+1,array,len,path);
//统统变成小写
if(array[depth]>='a'&&array[depth]<='z'){path[depth]=array[depth];}
else{path[depth] = (char)(array[depth]+dis);}
dfs(depth+1,array,len,path);
}
}
我太马虎了,一开始总出现"!",断电调试了半天后来发现是+dis -dis搞反了,下回一定要认真!!!
认真,认真,再认真!
程序逻辑错误还得需要 断点调试,断电调试太香了!!!