LeetCode(79) Word Search
题目
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.
分析
开始采用回溯递归的方法实现,但是LeetCode的测试平台给出一个找不到Search的编译error,很是奇怪,待找到问题,再来更新。
CE代码
class Solution {
public:
bool Search(vector<vector<char> > &board, int &x, int &y, string &word, vector<vector<int> > &isVisited)
{
if (word.empty())
return true;
//当前字符有4个查找方向上、下、左、右
vector<vector<int> > Direction = { { 0, 1 }, { 0, -1 }, { -1, 0 }, { 1, 0 } };
for (size_t i = 0; i < Direction.size(); ++i)
{
//要查找的下一个字符
int xx = x + Direction[i][0];
int yy = y + Direction[i][1];
if (xx >= 0 && yy >= 0 && xx < board.size() && yy < board[xx].size() && isVisited[xx][yy] == 0 && board[xx][yy] == word[0])
{
isVisited[xx][yy] = 1;
if (word.length() == 1 || Search(board, xx, yy, word.substr(1), isVisited))
return true;
isVisited[xx][yy] = 0;
}//if
}//for
return false;
}
bool exist(vector<vector<char>>& board, string word) {
if (board.empty() || board[0].empty())
return false;
if (word.empty())
return true;
int m = board.size();
int n = board[0].size();
vector<vector<int> > isVisited(m, vector<int>(n, 0));
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
if (!word.empty() && board[i][j] == word[0])
{
//修改访问标志为1 代表已访问
isVisited[i][j] = 1;
if (word.length() == 1 || Search(board, i, j, word.substr(1), isVisited))
return true;
//若没有找到目标串,则从下一个字符重新查找,将当前字符访问标志改为0
isVisited[i][j] = 0;
}
}//for
}//for
return false;
}
};
AC代码
此处代码源于参考博客,收益良多,谢谢博主。
其思想是:
用栈记录当前搜索的路径。
栈存放的节点包括4个成员: 字符c, x,y坐标,已遍历方向p。
注意p在回溯法中是非常重要的,用来记录已遍历过的方向(按照上下左右的顺序),不然的话就会出现无限循环的同一节点进栈出栈。
进栈之后的节点置为’*’,以免同一节点多次进栈。
出栈之后的节点恢复为word[wind]。
struct Node
{
char c;
int x;
int y;
int p; //next trial is 0-up, 1-down, 2-left, 3-right
Node(char newc, int newx, int newy, int newp): c(newc), x(newx), y(newy), p(newp) {}
};
class Solution {
public:
bool exist(vector<vector<char> > &board, string word) {
if(board.empty() || board[0].empty())
return false;
int m = board.size();
int n = board[0].size();
for(int i = 0; i < m; i ++)
{
for(int j = 0; j < n; j ++)
{
if(board[i][j] == word[0])
{// maybe a success
stack<Node> stk;
Node curnode(word[0], i, j, 0);
stk.push(curnode);
board[curnode.x][curnode.y] = '*';
int wind = 1;
if(wind == word.size())
return true;
while(!stk.empty())
{
if(stk.top().p == 0)
{
stk.top().p = 1;
if(stk.top().x > 0 && board[stk.top().x-1][stk.top().y] == word[wind])
{
Node nextnode(word[wind], stk.top().x-1, stk.top().y, 0);
stk.push(nextnode);
board[nextnode.x][nextnode.y] = '*';
wind ++;
if(wind == word.size())
return true;
continue;
}
}
if(stk.top().p == 1)
{
stk.top().p = 2;
if(stk.top().x < m-1 && board[stk.top().x+1][stk.top().y] == word[wind])
{
Node nextnode(word[wind], stk.top().x+1, stk.top().y, 0);
stk.push(nextnode);
board[nextnode.x][nextnode.y] = '*';
wind ++;
if(wind == word.size())
return true;
continue;
}
}
if(stk.top().p == 2)
{
stk.top().p = 3;
if(stk.top().y > 0 && board[stk.top().x][stk.top().y-1] == word[wind])
{
Node nextnode(word[wind], stk.top().x, stk.top().y-1, 0);
stk.push(nextnode);
board[nextnode.x][nextnode.y] = '*';
wind ++;
if(wind == word.size())
return true;
continue;
}
}
if(stk.top().p == 3)
{
stk.top().p = 4;
if(stk.top().y < n-1 && board[stk.top().x][stk.top().y+1] == word[wind])
{
Node nextnode(word[wind], stk.top().x, stk.top().y+1, 0);
stk.push(nextnode);
board[nextnode.x][nextnode.y] = '*';
wind ++;
if(wind == word.size())
return true;
continue;
}
}
//restore
board[stk.top().x][stk.top().y] = stk.top().c;
stk.pop();
wind --;
}
}
}
}
return false;
}
};
LeetCode(79) Word Search的更多相关文章
- LeetCode(79): 单词搜索
Medium! 题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元 ...
- LeetCode(173) Binary Search Tree Iterator
题目 Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ...
- LeetCode(290) Word Pattern
题目 Given a pattern and a string str, find if str follows the same pattern. Here follow means a full ...
- Leetcode(8)字符串转换整数
Leetcode(8)字符串转换整数 [题目表述]: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我 ...
- LeetCode(275)H-Index II
题目 Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimi ...
- LeetCode(220) Contains Duplicate III
题目 Given an array of integers, find out whether there are two distinct indices i and j in the array ...
- LeetCode(154) Find Minimum in Rotated Sorted Array II
题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ...
- LeetCode(122) Best Time to Buy and Sell Stock II
题目 Say you have an array for which the ith element is the price of a given stock on day i. Design an ...
- LeetCode(116) Populating Next Right Pointers in Each Node
题目 Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode * ...
随机推荐
- sql server之exists用法
- CF #546div2D
题目本质:只有能做到一路过关斩将的勇者才能冒泡过来救出女主. 主要代码: ; int n, m, a[maxn], ans; vector<int> edge[maxn]; set< ...
- HDU4089(概率dp)
题解 要点: 1.转移方程分三段,这个……有点复杂但是还好吧……大概就是求啥设啥,然后只通过可行的状态过来.在纸上记一记. 2.每层里面必须先求dp[i][i],简直就是我求我自己……用类似进制数那种 ...
- [译]Understanding ECMAScript6 函数
函数 函数是任何编程语言的重要组成部分,而自从JavaScript被引入以来,JavaScript的函数就未有太多改变.遗留下来的积压问题及微妙行为使我们很容易犯错误,或者需要更多的代码来实现一个非常 ...
- AtCoder D - 高橋君と見えざる手 / An Invisible Hand 简单思维题
http://arc063.contest.atcoder.jp/tasks/arc063_b 因为每次都是选取最大值,那么用dp[i]表示第i个数结尾能得到最大是多少. 其实就是用a[i]去减去左边 ...
- split()分割字符串用法
<script type="text/javascript"> var str="How are you doing today?" documen ...
- 回顾Quick Sort(Javascript 实现)
Introduction QuickSort的时间复杂度渐近函数虽然不能达到MergeSort般的O(nlgn),但因其良好的时间常量以及平均运行时间而被广泛使用. 下图解释了QuickSort的过程 ...
- ubuntu kylin 13.10 无法安装ia32-libs解决方案
1.安装 Synaptic 2.sudo apt-get install synaptic 3.进入synaptic ,设置->软件库 4.点击 其他软件->添加 5.输入“deb ht ...
- ubuntu 14.04 安装tomcat服务器 配置图片路径和文件路径
root@hett-PowerEdge-T30:/usr/local/src# lltotal 235956drwxr-xr-x 6 root root 4096 3月 26 14:48 ...
- fgetc, fgets, getc, getchar, gets, ungetc - 输入字符和字符串
总览 (SYNOPSIS) #include <stdio.h> int fgetc(FILE *stream); char *fgets(char *s, int size, FILE ...