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();
    }
}

 

posted on 2022-01-04 17:37  cltt  阅读(96)  评论(0编辑  收藏  举报

导航