博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode(79): 单词搜索
阅读量:4322 次
发布时间:2019-06-06

本文共 2894 字,大约阅读时间需要 9 分钟。

Medium!

题目描述:

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =[  ['A','B','C','E'],  ['S','F','C','S'],  ['A','D','E','E']]给定 word = "ABCCED", 返回 true.给定 word = "SEE", 返回 true.给定 word = "ABCB", 返回 false.

解题思路:

这道题是典型的深度优先遍历DFS的应用,原二维数组就像是一个迷宫,可以上下左右四个方向行走,我们以二维数组中每一个数都作为起点和给定字符串做匹配,我们还需要一个和原数组等大小的visited数组,是bool型的,用来记录当前位置是否已经被访问过,因为题目要求一个cell只能被访问一次。如果二维数组board的当前字符和目标字符串word对应的字符相等,则对其上下左右四个邻字符分别调用DFS的递归函数,只要有一个返回true,那么就表示可以找到对应的字符串,否则就不能找到。

C++解法一:

1 class Solution { 2 public: 3     bool exist(vector
>& board, string word) { 4 if (board.empty() || board[0].empty()) return false; 5 int m = board.size(), n = board[0].size(); 6 vector
> visited(m, vector
(n, false)); 7 for (int i = 0; i < m; ++i) { 8 for (int j = 0; j < n; ++j) { 9 if (search(board, word, 0, i, j, visited)) return true;10 }11 }12 return false;13 }14 bool search(vector
>& board, string word, int idx, int i, int j, vector
>& visited) {15 if (idx == word.size()) return true;16 int m = board.size(), n = board[0].size();17 if (i < 0 || j < 0 || i >= m || j >= n || visited[i][j] || board[i][j] != word[idx]) return false;18 visited[i][j] = true;19 bool res = search(board, word, idx + 1, i - 1, j, visited) 20 || search(board, word, idx + 1, i + 1, j, visited)21 || search(board, word, idx + 1, i, j - 1, visited)22 || search(board, word, idx + 1, i, j + 1, visited);23 visited[i][j] = false;24 return res;25 }26 };

我们还可以不用visited数组,直接对board数组进行修改,将其遍历过的位置改为井号,记得递归调用完后需要恢复之前的状态。

C++解法二:

1 class Solution { 2 public: 3     bool exist(vector
>& board, string word) { 4 if (board.empty() || board[0].empty()) return false; 5 int m = board.size(), n = board[0].size(); 6 for (int i = 0; i < m; ++i) { 7 for (int j = 0; j < n; ++j) { 8 if (search(board, word, 0, i, j)) return true; 9 }10 }11 return false;12 }13 bool search(vector
>& board, string word, int idx, int i, int j) {14 if (idx == word.size()) return true;15 int m = board.size(), n = board[i].size();16 if (i < 0 || j < 0 || i >= m || j >= n || board[i][j] != word[idx]) return false;17 char c = board[i][j];18 board[i][j] = '#';19 bool res = search(board, word, idx + 1, i - 1, j) 20 || search(board, word, idx + 1, i + 1, j)21 || search(board, word, idx + 1, i, j - 1)22 || search(board, word, idx + 1, i, j + 1);23 board[i][j] = c;24 return res;25 }26 };

 

转载于:https://www.cnblogs.com/ariel-dreamland/p/9154703.html

你可能感兴趣的文章
javascript 学习随笔7
查看>>
<P>标签小细节
查看>>
Linux 命令 - netstat
查看>>
安卓模拟器genymotion安装
查看>>
C 语言中包含的标准头文件(24个)
查看>>
移动硬盘启动盘制作
查看>>
mac 关闭&&显示隐藏文件命令
查看>>
Altium Designer 10 导出文件(PDF,gerber,BOM)
查看>>
&spi1 , spi1 = &spi1; status = "okay"
查看>>
mysql备份与还原 数据库的常用命令。
查看>>
完成登录与注册页面的前端
查看>>
NIO学习之Channel
查看>>
两分布间距离的度量:MMD、KL散度、Wasserstein 对比
查看>>
HDU 1300 Pearls (DP)
查看>>
2014年军训总结
查看>>
扩展 -------jQuery
查看>>
Winform跨线程操作最简单的办法
查看>>
[51nod1532]带可选字符的多字符串匹配
查看>>
socket 基于udp实现远程执行命令
查看>>
读取本地json文件,解析json
查看>>