leetcode 刷题之路 33 Word Search

来源:互联网 发布:淘宝怎么开店上传图片 编辑:程序博客网 时间:2024/06/05 23:41

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 =

[  ["ABCE"],  ["SFCS"],  ["ADEE"]]
word = "ABCCED", -> returns true,
word = "SEE", -> returns true,

word = "ABCB", -> returns false.

给定一个字符矩阵和一个单词,判断这个字符矩阵中是否存在连续相邻的序列正好和这个单词相同。

采用DFS思想解决这道问题。首先需要找到DFS的起始点,遍历整个字符矩阵,找到和word的第一个字符相同的字符,从该字符处开始进行深度优先搜索,也就是代码里面的searchHelper函数所实现的功能。这里我没有采用常规的visited数组来标志访问过的字符,而是直接将访问过得字符改成‘$’,这样能够达到同样的目的并且还能节省空间。searchHelper函数中这样处理:对于字符矩阵中已经匹配的字符,递归调用searchHelper来判断这个字符的周围相邻的四个字符(若该字符处于边界,可能是两个或者三个相邻字符,需要做条件判断,小心访问越界)是否和word的下一个字符匹配,递归结束的条件是匹配到word的结尾的下一个位置,此时说明之前的所有字符已经全部匹配上了。

注意,如果使用visited数组的话,一定要使用引用传递或者指针传递的方法,否则很有可能会引起Time Limited Exceed错误,另外,我刚开始写的时候,先对周围的字符执行searchHelper操作,然后将操作的结果暂存在了四个变量上,最后再对这四个变量做或操作后返回,这样做没有错,但是也很有可能引起Time Limited Exceed错误,正确的做法是找到一个匹配后直接返回即可。

细节决定成败,在编程时对待时间和空间,我们要做到雁过拔毛,锱铢必较。

代码:

class Solution {public:bool exist(vector<vector<char> > &board, string word){if (word.length() == 0)return false;for (int i = 0; i < board.size(); i++)for (int j = 0; j < board[i].size(); j++){int k = 0;if (board[i][j] == word[0]){board[i][j] = '$';if (searchHelper(board, word, 1, i, j))return true;board[i][j] = word[0];}}return false;}static bool searchHelper(vector<vector<char> > &board,string &word, int k, int m, int n){if (k == word.length())return true;if (m>0 && board[m - 1][n] == word[k]){board[m - 1][n] = '$';if (searchHelper(board,word, k + 1, m - 1, n))return true;elseboard[m - 1][n] = word[k];}if (m<board.size() - 1 && board[m + 1][n] == word[k]){board[m + 1][n] = '$';if (searchHelper(board, word, k + 1, m + 1, n))return true;board[m + 1][n] = word[k];}if (n>0 && board[m][n - 1] == word[k]){board[m][n - 1] = '$';if (searchHelper(board, word, k + 1, m, n - 1))return true;board[m][n - 1] = word[k];}if (n < board[m].size() - 1 && board[m][n + 1] == word[k]){board[m][n + 1] = '$';if (searchHelper(board, word, k + 1, m, n + 1))return true;board[m][n + 1] = word[k];}return false;}};




0 0
原创粉丝点击