算法设计与应用基础:第十六周(1)

来源:互联网 发布:达州市行知中学 编辑:程序博客网 时间:2024/06/04 19:33
 

79. Word Search

DescriptionHintsSubmissionsSolutions
  • Total Accepted: 122901
  • Total Submissions: 468065
  • Difficulty: Medium
  • Contributor: LeetCode

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,对于遍历到的每一个点继续遍历它可以达到的其他点,这个过程中如果找到了word就返回ture,否则最后返回false,注意递归调用中维护visited数组(即每次对一个点上锁和解锁。代码如下:
class Solution {public:    bool dfs(vector<vector<char>>&board, string word, int count, int row, int col, vector<vector<int>>&visited)      {          if (count == word.size() - 1)              return true;          visited[row][col] = 1;//已经访问locked        if (row + 1 < board.size() &&visited[row+1][col]==0&& board[row + 1][col] == word[count + 1] )              if (dfs(board, word, count + 1, row + 1, col, visited))                  return true;          if (row - 1 >= 0 &&visited[row-1][col]==0&& board[row - 1][col] == word[count + 1] )              if (dfs(board, word, count + 1, row - 1, col, visited))                  return true;          if (col + 1 < board[0].size() &&visited[row][col+1]==0&& board[row][col + 1] == word[count + 1] )              if (dfs(board, word, count + 1, row, col + 1, visited))                  return true;          if (col - 1 >= 0 &&visited[row][col-1]==0&& board[row][col - 1] == word[count + 1] )              if (dfs(board, word, count + 1, row, col - 1, visited))                  return true;          visited[row][col] = 0;//失败之后要恢复到未访问的状态  unlocked        return false;      }  public:      bool exist(vector<vector<char>>& board, string word) {          if (word.size() == 0)              return true;          int row = board.size();          int col = board[0].size();          vector<vector<int>>visited(row, vector<int>(col));          //0----unvisited          //1----visited          if (row == 0 || col == 0)              return false;          for (int i = 0; i < row; i++)          {              for (int j = 0; j < col; j++)              {                  if (board[i][j] == word[0])                  {                      if (dfs(board, word, 0, i, j, visited))//开始递归                          return true;                  }              }          }          return false;      }  };
注:这道题一开始是想用非递归来写的,但是因为无法解决回路的问题,最后不得已用了递归的方法,非递归的方法想出来了再补充。