算法日常训练9.26

算法日常训练9.26_第1张图片

 这种回溯题都不会写就离谱,就两种情况的回溯,一个左括号一个右括号,哪个题目比较像?李白喝酒的ab序列,两种情况直接列,就相当于for循环,为什么不用remove,因为用的数组保存,回溯后直接覆盖这一层的前一种情况,走到最后一层再加个验证。

class Solution {
    List res=new ArrayList<>();
    public List generateParenthesis(int n) {
        char[] path=new char[2*n];//一个括号两个字符
        backtracking(path,0);
        return res;
    }
    public void backtracking(char[] path,int i){
        if(i==path.length)//代表最后一个字符也赋值了
        {
            if(validata(path))//验证是否有效
            res.add(new String(path));
            return;
        }
        path[i]='(';
        backtracking(path,i+1);
        path[i]=')';
        backtracking(path,i+1);
    }
    public boolean validata(char[] path){
        int left=0;
        for(int i=0;i

算法日常训练9.26_第2张图片

 只要能理解回溯就是个树状图一点一点往下走,就能很好的解决这种问题,第一个数字代表第一层,然后第二层。。。走到最后一层,再记录是从第一层来到最后一层的情况,因为要列举每一层的每一个字母,所以用了两层循环,遍历所有情况

class Solution {
    String[] nums=new String[]{"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    List res=new ArrayList<>();//保存结果
    StringBuilder path=new StringBuilder();//保存情况
    public List letterCombinations(String digits) {
        if(digits.length()==0) return res;
        char[] arr=digits.toCharArray();
        backtracking(arr,0);
        return res;
    }
    public void backtracking(char[] arr,int start){
        if(start==arr.length&&path.length()==arr.length){//走到最后一层并且路径长度等于数字长度就是一种情况
            res.add(new String(path));//加到结果中
            return;
        }
        
        for(int i=start;i

算法日常训练9.26_第3张图片

 用的是普通的dfs,没什么剪枝操作,效率比较低,找到第一个字母开始一层一层往下找,其实就是一种回溯,注意条件的使用很好解决。

class Solution {
    int[][] dir={{1,0},{-1,0},{0,1},{0,-1}};//四个方向
    boolean[][] used;//标志是否访问过
    boolean res=false;
    public boolean exist(char[][] board, String word) {
        char[] arr=word.toCharArray();
        used=new boolean[board.length][board[0].length];
        for(int i=0;i=0&&newi=0&&newj

你可能感兴趣的:(算法,java,开发语言)