LeetCode 784 字母大小写全排列
784.字母大小写全排列 力扣
原题链接
我的结果
求解思路
- 
这也是一个典型的回溯问题,dfs就可以解决。
 - 
之前做过dfs的类型题,大体思路一样,重在细节,和编程的灵活性
 - 
由于遍历的元素是基本类型,所以path(搜索路径)用char[]表示,这样不涉及入栈出栈了,遍历完不用考虑更新,直接在原来数组上赋值即可
 - 
对比之前的题里for循环里嵌套递龟函数,这道题每层只有两个选择,且大小不变,故可以不用for来处理,写两个条件,这两个条件顺序执行,每个条件里放入递龟函数。
///原来的框架 bfs( ){ //终止条件 if(){ return; } for( ){ bfs( ) } } ///这道题完全可以这样 bfs(){ //终止条件 if(){} //统统写成大写 bfs(); //统统写成小写 bfs(); } 
代码
class Solution {
    List ans = new ArrayList<>();
    int dis = 'a'-'A';
    public List 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搞反了,下回一定要认真!!!
认真,认真,再认真!
程序逻辑错误还得需要 断点调试,断电调试太香了!!!