LeetCode 79. Word Search单词搜索 (C++)

摘要:
同一单元格中的字母不能重复使用。搜索问题有点像迷宫,但它只是根据给定单词的字母顺序进行搜索,遍历棋盘中的每个元素,并判断它是否与word中的第一个字母相同。如果相同,则搜索当前位置,查看与顶部、底部、左侧和右侧相邻的单元格的元素是否与当前字母的下一个字母相同。如果它们不在搜索范围内或字母不同,则返回false。当搜索的字母数等于单词的长度时,表示该单词在板上找到。

题目:

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.

Example:

board =
[
  ['A','B','C','E'],
  ['S','F','C','S'],
  ['A','D','E','E']
]

Given word = "ABCCED", return true.
Given word = "SEE", return true.
Given word = "ABCB", return false.

分析:

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

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

一道搜索的题目,有点类似走迷宫,只不过按照给定单词字母顺序来寻找,遍历board中每一个元素,判断与word中的第一个字母是否相同,如果相同则在当前位置上去搜索上下左右相邻的单元格的元素是否和当前字母的下一个字母相同,不在搜索范围内或者字母不同就返回false,当搜索的字母数等于word的长度时,也就表明在board找到了这个word。注意每次判断一个字母要标记当前位置以搜索过,以防止字母重复利用。我选择直接更改board元素,以便在后续的判断中不会重复判断此位置,在搜索结束后改回来就可以了。

程序:

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        h = board.size();
        w = board[0].size();
        for(int i = 0; i < h; i++){
            for(int j = 0; j < w; ++j){
                if(searchexist(board, word, 0, i, j)) return true;
            }
        }
        return false;
    }
    int searchexist(vector<vector<char>>& board, string &word, int n, int x, int y){
        if(x < 0 || x > h-1 || y < 0 || y > w-1 || word[n] != board[x][y])
            return 0;
        if(n == word.length()-1)
            return 1;
        char temp = board[x][y];
        board[x][y] = 0;
        int flag = searchexist(board, word, n+1, x+1, y)
                 ||searchexist(board, word, n+1, x-1, y)
                 ||searchexist(board, word, n+1, x, y+1)
                 ||searchexist(board, word, n+1, x, y-1);
        board[x][y] = temp;
        return flag;
    }
private:
    int h, w;
};

免责声明:文章转载自《LeetCode 79. Word Search单词搜索 (C++)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇完整uploadify批量上传文件插件使用JAVA_SE基础——44.抽象类的练习下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

英文文本的词频统计

英文文本由于不涉及分词问题,词频统计相对而言简单一些。以下是一个对英文文本进行词频统计的例子。其中的关键问题有:(1)英文中同时存在大小写,会干扰词频统计的结果,所以应将所有的英文字母转化为大写或小写;(2)英文单词可能被空格、标点或其他特殊符号分隔,因此应将这些特殊符号统一替换为空格;(3)根据空格对文本进行分隔;(4)用词典统计单词的出现次数;(5)由...

统计单词个数(NOIP 2001提高组)

题目描述 Description 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份(1<k<=40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和i...

vim的几个插件mark.vim ctrlp.vim等

开发过程中, 保证语义的前提下, 尽量使用 短的 变量名: 如: 用 $map来代替 $condition , 因为在书写长的变量名的时候, 容易写错, 而排查错误, 还不容易找出来. vim在浏览和排查代码的错误时, 常常需要高亮同一单词或变量, 所以使用 mark.vim. 简单的配置方法是: 下面的反斜杠, 是指的映射键. m 高亮或反高亮一个单词...

【trie树】HDU1251统计难题

统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 60040 Accepted Submission(s): 20857 Problem Description Ignati...

xshell快捷键

ctrl + tab 切换选项卡 删除ctrl + d      删除光标所在位置上的字符相当于VIM里x或者dlctrl + h      删除光标所在位置前的字符相当于VIM里hx或者dhctrl + k      删除光标后面所有字符相当于VIM里d shift+$ctrl + u      删除光标前面所有字符相当于VIM里d shift+^ct...

分享一个开源小工具,关于单词的

1、前言 之前我在以前的博客分享过,之后一段时间内,我一直在用,也一直在根据自己的需要进行修改。 后面会有源码,手写的代码一共210行,修改起来很方便。 先会有使用介绍,希望可以引起读者的兴趣。 这是一种应对英文单词的策略,会以人为中心,小工具会智能化的辅助记忆。 小工具会用google翻译获得释义,相对可靠一些。 虽然工具会收集历史单词,但是历史单词丢失...