题目

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;
}
};

GitHub测试程序源码

LeetCode(79) Word Search的更多相关文章

  1. LeetCode(79): 单词搜索

    Medium! 题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元 ...

  2. LeetCode(173) Binary Search Tree Iterator

    题目 Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ...

  3. LeetCode(290) Word Pattern

    题目 Given a pattern and a string str, find if str follows the same pattern. Here follow means a full ...

  4. Leetcode(8)字符串转换整数

    Leetcode(8)字符串转换整数 [题目表述]: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我 ...

  5. LeetCode(275)H-Index II

    题目 Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimi ...

  6. LeetCode(220) Contains Duplicate III

    题目 Given an array of integers, find out whether there are two distinct indices i and j in the array ...

  7. LeetCode(154) Find Minimum in Rotated Sorted Array II

    题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ...

  8. 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 ...

  9. LeetCode(116) Populating Next Right Pointers in Each Node

    题目 Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode * ...

随机推荐

  1. Codeforces Round #388 (Div. 2) D

    There are n people taking part in auction today. The rules of auction are classical. There were n bi ...

  2. C++ 自定义结构体的Priority Queue

    比较函数return true 意味着排序需要交换. #include <iostream> #include <queue> #include <vector> ...

  3. 使用nvmw解决windows下多版本node共存的问题

    不支持4.x的nodejs,用nodist吧 不支持4.x的nodejs,用nodist吧 不支持4.x的nodejs,用nodist吧 ===========不要再看的分割线============ ...

  4. 使用openssl 生成免费证书

    阅读目录 一:什么是openssl? 它的作用是?应用场景是什么? 二:使用openssl生成免费证书 回到顶部 一:什么是openssl? 它的作用是?应用场景是什么? 即百度百科说:openssl ...

  5. Unity Shader入门精要学习笔记 - 第7章 基础纹理

    转自 冯乐乐的 <Unity Shader 入门精要> 纹理最初的目的就是使用一张图片来控制模型的外观.使用纹理映射技术,我们可以把一张图“黏”在模型表面,逐纹素地控制模型的颜色. 在美术 ...

  6. PLSQL连接Oracle64监听和服务的配置!

    前言: 这里不会涉及到太多关于版本问题的解决,只是简单提一下基本的监听和服务配置问题的解决,让你可以快速的用PLSQL连接上你自己创建的Oracle数据库(这里示例数据库名为ORCL); 版本问题: ...

  7. ES-windos环境搭建(1)

    前言 由于elasticsearch为Java开发,所以它还依赖Java JDK环境,并且对版本还有要求,需要1.8(含)以上.我们首先来配置Java JDK环境. JDK简介 JDK是Java语言的 ...

  8. zookeeper系列 (第一章 :ubuntu 下安装zookeeper)

    1.zookeeper是分布式一致性管理服务.解决了分布式中死锁,不一致,原子性操作等问题. 2.环境:系统ubuntu,zookeeper 下载地址:http://archive.apache.or ...

  9. {g2o}Installation Notes:ccmake

    main reference: http://www.cnblogs.com/gaoxiang12/p/3776107.html "注意libqglviewer-qt4-dev只在ubunt ...

  10. RAM建模和初始化

    冯诺依曼提出的存储计算,计算存储,因此,几乎所有的CPU和ASIC都会使用存储器,它们的类型很多,包括异步RAM.同步RAM.ZBT RAM.DDR DRAM.ROM等.由于大部分的异步RAM和SRA ...