字符矩阵内单词搜索

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

单词搜索


问题链接:word search!!!

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。


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


示例 1:

922b05d25b514e888feebd3a96fd7217.png


输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true


示例 2:


778b5db6110645b1acf7c2e443c8a553.png


输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
输出:true


示例 3:


9db894a781aa4d6395a149eb4de3a0ad.png


输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
输出:false


解题思路


深度优先搜索:先找到方格中字符串的开头字符,然后进行深度优先搜索算法,判断是否能够搜索到长度达到指定word长度的字符串。


代码样例


int x[4]={0,1,0,-1},y[4]={1,0,-1,0};
bool dfs(vector<vector<char>>& board,vector<vector<bool>>& used,string& word,int index,int i,int j){
    if(index>=word.length()){
        return true;
    }
    int m=board.size(),n=board[0].size();
    bool temp=false;
    for(int orient=0;orient<4;orient++){
        int _x=i+x[orient],_y=j+y[orient];
        if(_x<0||_x>=m||_y<0||_y>=n){
            continue;
        }
        if(!used[_x][_y]&&board[_x][_y]==word[index]){
            used[_x][_y]=true;
            temp=dfs(board,used,word,index+1,_x,_y);
            if(temp){
                break;
            }
            used[_x][_y]=false;
        }
    }
    return temp;
}
bool exist(vector<vector<char>>& board, string word) {
    int m=board.size(),n=board[0].size();
    vector<vector<bool>> used(m,vector<bool>(n));
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(board[i][j]==word[0]){
                used[i][j]=true;
                bool temp=dfs(board,used,word,1,i,j);
                if(temp){
                    return true;
                }
                used[i][j]=false;
            }
        }
    }
    return false;
}


代码分析


深度优先搜索算法的退出条件、继续搜索条件和边界条件。


//1
if(index>=word.length()){
  return true;
}
//2
if(!used[_x][_y]&&board[_x][_y]==word[index]){
//3
int _x=i+x[orient],_y=j+y[orient];
if(_x<0||_x>=m||_y<0||_y>=n){
    continue;
}


这里在定义深度优先搜索函数时需要注意传值和传引用的区别,这样是对board、used、word等变量进行传引用bool dfs(vector<vector<char>>& board,vector<vector<bool>>& used,string& word,int index,int i,int j)。如果将其改成传值的形式(bool dfs(vector<vector<char>> board,vector<vector<bool>> used,string word,int index,int i,int j))会导致算法超时,难以在限制的时间内执行完测试样例。

按照以上算法可以击败大多数人的提交程序。


118826e6c1bc4ef593a9f3258dc23c10.png

目录
相关文章
|
6月前
|
Linux
C 统计英文文本word(单词)个数
关于状态机的文章请自行百度,这里主要是在统计时用到了2个状态,IN是代表字符是属于word内,OUT代表当前字符不属于word内,那么什么时候word的个数需要增加1呢,即是status从OUT到IN时(说明当前指针马上就要走到word里了)
41 1
|
6月前
|
算法 Java C++
实现一个单词搜索游戏,给定一个二维网格和一个单词列表,找到单词列表中出现在网格中的所有单词(提示:Trie树 + DFS)。
实现一个单词搜索游戏,给定一个二维网格和一个单词列表,找到单词列表中出现在网格中的所有单词(提示:Trie树 + DFS)。
35 0
|
6月前
leetcode-79:单词搜索
leetcode-79:单词搜索
49 0
|
6月前
leetcode-212:单词搜索 II
leetcode-212:单词搜索 II
46 0
|
Python
python字符串切分连接(输入一个包含多个单词的英文句子,单词间以空格分隔,标点符号后跟一个空格。定义一个函数,功能是用指定的符号把单词连接起来。)
python字符串切分连接(输入一个包含多个单词的英文句子,单词间以空格分隔,标点符号后跟一个空格。定义一个函数,功能是用指定的符号把单词连接起来。)
1065 0
|
算法 C++
单词搜索:在二维网格中寻找单词的存在
单词搜索:在二维网格中寻找单词的存在
73 0
|
C++
C/C++每日一练(20230506) 翻转词序、字符金字塔、单词搜索
C/C++每日一练(20230506) 翻转词序、字符金字塔、单词搜索
112 0
7-4 统计一行文本的单词个数
7-4 统计一行文本的单词个数
106 0
每日三题-子集、单词搜索、删除无效的括号
每日三题 子集 单词搜索 删除无效的括号
80 1
每日三题-子集、单词搜索、删除无效的括号