leetcode练习 单词搜索

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

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

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

提示:

  • m == board.length
  • n = board[i].length
  • 1 <= m, n <= 6
  • 1 <= word.length <= 15
  • boardword 仅由大小写英文字母组成

思路:本题可以利用回溯法,首先我们从board[0][0]开始,找到和word[0]相同的位置,进入回溯,从上下左右四个方向上找到未访问且和word匹配的位置,当index和word单词长度相同时,证明存在,flag置为true,在编写过程中,要注意边界位置和已访问位置的判断。我自己在编写代码时,有一个点困扰我较长时间,由于题目中给的word是string类型,而我想要用char数组来进行遍历,转化之后,因为在回溯时要判断index是否是等于word长度,因此要用strlen计算字符串长度,但我们要注意,如果在转化时,只将string成员转化过来,没有加'\0'就会发生越界报错。因此在编写时一定注意。

cpp 复制代码
class Solution {
public:
    bool flag=false; 
    void backtracing(vector<vector<int>>&visited,char word[],vector<vector<char>>&board,int i,int j,int index)
    {
        if(flag)return ;
        int m=board.size();
        int n=board[0].size();
        
        if(index==strlen(word))
        {
            flag=true;
            return ;
        }
        if(i<0||i>=m||j<0||j>=n||board[i][j]!=word[index]||visited[i][j])
        {
            return ;
        }
        visited[i][j]=1;
        backtracing(visited,word,board,i-1,j,index+1);
        backtracing(visited,word,board,i+1,j,index+1);
        backtracing(visited,word,board,i,j-1,index+1);
        backtracing(visited,word,board,i,j+1,index+1);
        visited[i][j]=0;
    }
    bool exist(vector<vector<char>>& board, string word) {
        int m=board.size();
        int n=board[0].size();
        int len=word.size();
        char *arr=new char[len+1];
        for(int i=0;i<len;i++)
        {
            arr[i]=word[i];
        }
        arr[len]='\0';
        vector<vector<int>>visited(m,vector<int>(n,0));
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(board[i][j]==arr[0])
                {
                    backtracing(visited,arr,board,i,j,0);
                }
            }
        }
        return flag;
    }
};
相关推荐
C++ 老炮儿的技术栈4 分钟前
tinyxml2 开源库与 VS2010 结合使用
c语言·数据结构·c++·算法·机器人
平平无奇我要摘星星10 分钟前
leetcode1_455.分发饼干
算法·leetcode
Joern-Lee31 分钟前
机器学习算法:支持向量机SVM
算法·机器学习·支持向量机
秋说41 分钟前
【PTA数据结构 | C语言版】计算1~n与1~m每一项相互乘积的和
c语言·数据结构·算法
秋说44 分钟前
【PTA数据结构 | C语言版】计算1~n平方的和加上1~n的和
c语言·数据结构·算法
C++ 老炮儿的技术栈1 小时前
Visual Studio 2022 MFC Dialog 添加Toolbar及Tips提示
服务器·c语言·数据库·c++·ide·算法·visual studio
水果里面有苹果1 小时前
18-C#改变形参内容
java·数据结构·算法
前端拿破轮1 小时前
女朋友要和我分手?!!居然是因为交不出赎金信,不会用哈希表😭😭😭
算法·leetcode·typescript
CoovallyAIHub2 小时前
基于YOLOv11的CF-YOLO,如何突破无人机小目标检测?
深度学习·算法·计算机视觉
huihui4502 小时前
一天一道Sql题(day04)
算法