学习剑指offer: 第14天

101 阅读1分钟

矩阵中的路径

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

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

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
输入: board = [["a","b"],["c","d"]], word = "abcd"
输出: false

提示:

  • 1 <= board.length <= 200
  • 1 <= board[i].length <= 200
  • board 和 word 仅由大小写英文字母组成

leetcode-cn.com/problems/ju…

class Solution {
    public boolean exist(char[][] board, String word) {
        if(board.length == 0 || word.length() == 0){
            return false;
        }
        int[][] visited = new int[board.length][board[0].length];

        for(int i=0; i<board.length;i++){
            for(int j=0; j<board[0].length;j++){
                boolean f = dfs(i,j,"", word,board,visited);
                if(f){
                    return true;
                }
            }
        }
        return false;
    }

    public boolean dfs(int x, int y, String pre, String word, char[][] board, int[][] visited){

        visited[x][y] = 1;
        String text = pre + board[x][y];
        if(text.equals(word)){
            return true;
        }
        if(!word.startsWith(text)){
            visited[x][y] = 0;
            return false;
        }
        int[][] arr = new int[][]{{0,1},{1,0}, {0,-1}, {-1,0}};

        for(int i=0; i<arr.length; i++){
            int nx = x+arr[i][0];
            int ny = y + arr[i][1];
            if(nx <0 || ny< 0 || nx> board.length -1|| ny> board[0].length -1){
                continue;
            }

            if(visited[nx][ny] ==1){
                continue;
            }
            boolean flag = dfs(nx, ny, text, word, board, visited);
            if(flag){
                return true;
            }
            visited[nx][ny] = 0;
        }
        visited[x][y] = 0;
        return false;

    }
}

机器人的运动范围

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

输入: m = 2, n = 3, k = 1
输出: 3
输入: m = 3, n = 1, k = 0
输出: 1

提示:

  • 1 <= n,m <= 100
  • 0 <= k <= 20
class Solution {
    public int movingCount(int m, int n, int k) {
        int[][] visited = new int[m][n];
        int[][] counted = new int[m][n];
        dfs(0,0,m,n,k,visited, counted);
        int count =0;
        for(int i=0; i<m;i++){
            for(int j=0; j<n;j++){
                if(counted[i][j]== 1){
                    count++;
                }
            }
        }
        return count;
    }

    public void dfs(int x, int y, int m, int n, int k, int[][] visited, int[][] counted){
        if(x <0 || y<0|| x>=m ||y>=n){
            return;
        }
        if(visited[x][y] == 1){
            return;
        }
        visited[x][y] = 1;
        if(x%10 +x/10 + y%10 +y/10 <= k){
            counted[x][y] =1;
            dfs(x+1, y, m, n, k, visited,counted);
            dfs(x-1, y, m, n, k, visited,counted);
            dfs(x, y+1, m, n, k, visited,counted);
            dfs(x, y-1, m, n, k, visited,counted);
        }
      
    }
}