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;
    }
};
相关推荐
君义_noip1 分钟前
CSP-S 2025 提高级 第一轮(初赛) 阅读程序(3)
c++·算法·信息学奥赛·csp-s 初赛
玛卡巴卡ldf1 分钟前
【LeetCode 手撕算法】(栈)有效括号、最小栈、字符串解码、每日温度、柱状图最大矩形
java·数据结构·算法·leetcode·力扣
happyprince6 分钟前
05-FlagEmbedding 评估模块详解
算法
wuweijianlove11 分钟前
算法优化的多目标平衡与性能建模研究的技术7
算法
_深海凉_12 分钟前
LeetCode热题100-两两交换链表中的节点
算法·leetcode·链表
啊罗罗13 分钟前
windows下,c++的axv2+fma/avx-vnni加速计算demo
c++·windows·算法
qq_2837200515 分钟前
Embedding 调优实战技巧:从原理到落地,打造高精度向量检索
python·算法·词嵌入·调优
Xpower 1719 分钟前
OpenClaw近一月版本更替讲解
人工智能·学习·算法
Ulyanov24 分钟前
《从质点到位姿:基于Python与PyVista的导弹制导控制全栈仿真》: 刚体觉醒——6-DOF刚体动力学、四元数与全姿态解算
开发语言·人工智能·python·算法·系统仿真·雷达电子对抗仿真
Dillon Dong39 分钟前
机侧同步定子电压环的PI整定:从“对齐三个量“到“闭环四步法“
算法·变流器·风电控制·dfig