• JAVA dfs


    数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

    示例 1:

    输入:n = 3
    输出:["((()))","(()())","(())()","()(())","()()()"]
    

    示例 2:

    输入:n = 1
    输出:["()"]


    class Solution {
        int n;
        List<String> ret  =new ArrayList();
        public List<String> generateParenthesis(int n) {
         
         this.n  =n;
         StringBuilder ans = new StringBuilder();
         dfs(ans,0,0);
         return ret;
        }
        void dfs(StringBuilder ans,int le,int ri){
               if(ans.length()==2*n){
                   ret.add(ans.toString());
                   return ;
               }
               if(le<n){
                   ans.append('(');
                   dfs(ans,le+1,ri);
                   ans.deleteCharAt(ans.length()-1);
               }
               if(ri<le){
                   ans.append(')');
                   dfs(ans,le,ri+1);
                   ans.deleteCharAt(ans.length()-1);
               }
    
        }
    }

    给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

    单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

     

    class Solution {
        boolean vis[][];
        int dir[][]={{0,1},{0,-1},{1,0},{-1,0}};
        StringBuilder str  =new StringBuilder();
        int flag =0;
        int m,n;
        public boolean exist(char[][] board, String word) {
             m  =board.length;
             n  =board[0].length;
                 vis =new boolean[m][n];
                  for(int i=0;i<m;i++){
                      for(int j=0;j<n;j++){
                          if(flag==1) {
                              return true;
                          }
                          if(board[i][j]==word.charAt(0)){
                              dfs(i,j,board,word);
                              str.deleteCharAt(0);
                          }
                      }
                  }
                  return flag==1;
        }
        void  dfs(int x,int y,char [][] board,String word){
              if(flag==1) return ;
              str.append(board[x][y]);
               if(str.charAt(str.length()-1)!=word.charAt(str.length()-1)) 
               {   
                    return ;
               }
               vis[x][y]  =true;
              if(str.toString().equals(word)) {
                  flag  =1;
                  return ;
              }
              for(int i=0;i<4;i++){
                  int xx=x+dir[i][0];
                  int yy  =y+dir[i][1];
                   if(xx<0||xx>=m||yy<0||yy>=n) continue ;         
                  if(!vis[xx][yy]){          
                      dfs(xx,yy,board,word);
                      if(flag==1)  return ;
                      str.deleteCharAt(str.length()-1);
                  }
              }
               vis[x][y]  =false;
        }
    }

     

     由于题目只需要判断是否存在word,不需要记录字符串

    class Solution {
        boolean vis[][];
        int dir[][]={{0,1},{0,-1},{1,0},{-1,0}};
        StringBuilder str  =new StringBuilder();
        boolean ret  =false;
        int m,n;
        public boolean exist(char[][] board, String word) {
             m  =board.length;
             n  =board[0].length;
                 vis =new boolean[m][n];
                  for(int i=0;i<m;i++){
                      for(int j=0;j<n;j++){
                          if(ret==true) {
                              return true;
                          }
                          if(board[i][j]==word.charAt(0)){
                              ret  = dfs(i,j,board,word,0);
                          }
                      }
                  }
                  return ret;
        }
        boolean  dfs(int x,int y,char [][] board,String word,int num){     
               if(board[x][y]!=word.charAt(num)) 
               {   
                    return false;
               }
               vis[x][y]  =true;
              if(num==word.length()-1) {
                  return true;
              }
              for(int i=0;i<4;i++){
                  int xx=x+dir[i][0];
                  int yy  =y+dir[i][1];
                   if(xx<0||xx>=m||yy<0||yy>=n) continue ;         
                  if(!vis[xx][yy]){          
                     boolean flag =  dfs(xx,yy,board,word,num+1);
                      if(flag)  return true ;
                  }
              }
               vis[x][y]  =false;
               return false;
        }
    }

    给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

    叶子节点 是指没有子节点的节点。

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode() {}
     *     TreeNode(int val) { this.val = val; }
     *     TreeNode(int val, TreeNode left, TreeNode right) {
     *         this.val = val;
     *         this.left = left;
     *         this.right = right;
     *     }
     * }
     */
    class Solution {
        LinkedList<Integer> l  =new LinkedList();
        List<List<Integer>> ll  =new LinkedList<List<Integer>>();
        public List<List<Integer>> pathSum(TreeNode root, int target) {
                   
                   dfs(root,target);
                   return ll;
        }
        void dfs(TreeNode root,int target){
                 if(root==null) return ;
                   l.add(root.val);
                   target-=root.val;
                  if(root.left==null&&root.right==null){
                      if(target==0){
                          ll.add(new LinkedList(l));
                     }
                  }
                  dfs(root.left,target);
                  dfs(root.right,target);
                  l.removeLast();
        }
    }
  • 相关阅读:
    使用jquery.js写可增行删行可编辑的table
    当Ext.js中xtype: 'checkboxfield'时,没勾选则向后台发送的数据没有字段的解决方法
    沉迷js不能自拔~
    kubernetes concepts -- Pod Overview
    kubernetes concepts (一)
    所有锁的unlock要放到try{}finally{}里,不然发生异常返回就丢了unlock了
    Java故障定位方法总结
    年度计划
    minikube 设置CPU和内存
    Ubuntu 设置中文输入法
  • 原文地址:https://www.cnblogs.com/tingtin/p/15763369.html
Copyright © 2020-2023  润新知