LeetCode刷题记录
------分割线------
刷题记录5: 79.单词搜索
想到什么写什么:
塞翁失马焉知非福,一觉睡醒发现HR通知我华为技术二面了,所以说人生处处充满意外和惊喜啊。
提示:以下是本篇文章正文内容,下面案例可供参考
先将字符串转换为数组,从头开始遍历,每次判断二维数组是否和一维数组的字符相同,相同的话,则对这个二维数组的四周进行扩散,同时用一个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;
}
执行效率和空间复杂度都太高了,不好。
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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在文章开始写的时候,知道二面这个消息,随后也收到一个不能叫做坏消息吧,只能说有助于自己吧,其实结果和自己的判断是一致的,相信自己的判断,这点还是非常敏锐的。