LeetCode 784 字母大小写全排列

784.字母大小写全排列 力扣

LeetCode 784 字母大小写全排列

原题链接

我的结果

LeetCode 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搞反了,下回一定要认真!!!

认真,认真,再认真!

程序逻辑错误还得需要 断点调试,断电调试太香了!!!

上一篇:p1443 马的遍历//bfs


下一篇:二叉树遍历(BFS)