Middle-题目108:79. Word Search

来源:互联网 发布:泛型 java 方法 编辑:程序博客网 时间:2024/05/15 23:49

题目原文:
Given a 2D board and a word, find if the word exists in the grid.
The word can be constructed from letters of sequentially adjacent cell, where “adjacent” cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once.
For example,
Given board =
[
[‘A’,’B’,’C’,’E’],
[‘S’,’F’,’C’,’S’],
[‘A’,’D’,’E’,’E’]
]
word = “ABCCED”, -> returns true,
word = “SEE”, -> returns true,
word = “ABCB”, -> returns false.
题目大意:
给出一个矩阵,和一个单词,判断单词是否能由矩阵中一条路径连接出来。
题目分析:
一个简单的dfs,教科书式的dfs写法即可,搜到字母错误或者搜到数组边缘则退出,否则每次向四个方向搜索,注意这里的dfs是有返回值的,返回该条件下是否有解。
源码:(language:java)

public class Solution {    public boolean exist(char[][] board, String word) {        int row = board.length;        if(row==0)            return false;        int col = board[0].length;        boolean[][] visited = new boolean[row][col];        for(int i = 0;i<row;i++) {            for(int j=0;j<col;j++) {                            if(word.charAt(0) == board[i][j]) {                    if(dfs(board, i, j, visited, word, 0))                        return true;                  }            }        }        return false;    }    private boolean dfs(char[][] board, int i, int j, boolean[][] visited, String word, int index) {        if(index == word.length())            return true;        else if(i<0 || i>board.length-1 || j<0 || j>board[0].length-1 || word.charAt(index)!=board[i][j] || visited[i][j])            return false;        else {            visited[i][j]=true;            boolean result = dfs(board, i-1, j, visited, word, index+1) || dfs(board, i+1, j, visited, word, index+1) || dfs(board, i, j-1, visited, word, index+1) || dfs(board, i, j+1, visited, word, index+1);            visited[i][j] = false;            return result;        }    }}

成绩:
13ms,beats 58.16%,众数14ms,14.58%
cmershen的碎碎念:
本题基本上是一个教科书式的dfs,区别是dfs带有返回值判断是否有解。

0 0
原创粉丝点击