LeetCode刷题记录(5)-20231220

LeetCode刷题记录
------分割线------
刷题记录5: 79.单词搜索


文章目录

  • 前言
  • 一、题目内容
  • 二、自己的思路
  • 三、自己的代码实现
  • 四、精选代码
  • 总结


前言

想到什么写什么:

塞翁失马焉知非福,一觉睡醒发现HR通知我华为技术二面了,所以说人生处处充满意外和惊喜啊。


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目内容

LeetCode刷题记录(5)-20231220_第1张图片

二、自己的思路

	先将字符串转换为数组,从头开始遍历,每次判断二维数组是否和一维数组的字符相同,相同的话,则对这个二维数组的四周进行扩散,同时用一个set记录每次相同的数据,当返回false的时候,记得remove掉之前添加成功的元素,进行回溯。

三、自己的代码实现

public boolean exist(char[][] board, String word) {

    char[] array = word.toCharArray();
    int m = board.length;
    int n = board[0].length;
    for(int i=0;i set = new HashSet<>();
            if(judge(board,array,0,i,j,set)){
                return true;
            }
        }
    }
    return false;
}

public boolean judge(char[][]board,char[] array,int index,int row,int low,Set set){
    if(row<0||row>=board.length||low<0||low>=board[0].length){
        return false;
    }
    if(board[row][low]==array[index]){
        String str = String.valueOf(row)+String.valueOf(low);
        if(!set.add(str)){
            return false;
        }
        if(index==array.length-1){
            return true;
        }else{
            if(judge(board,array,index+1,row+1,low,set)||
            judge(board,array,index+1,row-1,low,set)||
            judge(board,array,index+1,row,low+1,set)||
            judge(board,array,index+1,row,low-1,set)){
                return true;
            }
            set.remove(str);
        }
    }else{
        return false;
    }
    return false;
}

LeetCode刷题记录(5)-20231220_第2张图片

执行效率和空间复杂度都太高了,不好。

四、精选代码

public class Solution {

private static final int[][] DIRECTIONS = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
private int rows;
private int cols;
private int len;
private boolean[][] visited;
private char[] charArray;
private char[][] board;

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

    this.len = word.length();
    this.charArray = word.toCharArray();
    this.board = board;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            if (dfs(i, j, 0)) {
                return true;
            }
        }
    }
    return false;
}

private boolean dfs(int x, int y, int begin) {
    if (begin == len - 1) {
        return board[x][y] == charArray[begin];
    }
    if (board[x][y] == charArray[begin]) {
        visited[x][y] = true;
        for (int[] direction : DIRECTIONS) {
            int newX = x + direction[0];
            int newY = y + direction[1];
            if (inArea(newX, newY) && !visited[newX][newY]) {
                if (dfs(newX, newY, begin + 1)) {
                    return true;
                }
            }
        }
        visited[x][y] = false;
    }
    return false;
}

private boolean inArea(int x, int y) {
    return x >= 0 && x < rows && y >= 0 && y < cols;
}
}

作者:liweiwei1419
链接:https://leetcode.cn/problems/word-search/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总结

在文章开始写的时候,知道二面这个消息,随后也收到一个不能叫做坏消息吧,只能说有助于自己吧,其实结果和自己的判断是一致的,相信自己的判断,这点还是非常敏锐的。

你可能感兴趣的:(leetcode,算法,职场和发展)