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;
    }
};
相关推荐
2301_7644413327 分钟前
使用python构建的应急物资代储博弈模型
开发语言·python·算法
hetao17338371 小时前
2025-12-11 hetao1733837的刷题笔记
c++·笔记·算法
Xの哲學1 小时前
Linux电源管理深度剖析
linux·服务器·算法·架构·边缘计算
小飞Coding1 小时前
一文讲透 TF-IDF:如何用一个向量“代表”一篇文章?
算法
算家计算1 小时前
突然发布!GPT-5.2深夜来袭,3个版本碾压人类专家,打工人该怎么选?
算法·openai·ai编程
s09071362 小时前
Xilinx FPGA 中ADC 数据下变频+ CIC 滤波
算法·fpga开发·fpga·zynq
TL滕3 小时前
从0开始学算法——第十二天(KMP算法练习)
笔记·学习·算法
Math_teacher_fan3 小时前
第二篇:核心几何工具类详解
人工智能·算法
汉克老师3 小时前
CCF-NOI2025第二试题目与解析(第二题、集合(set))
c++·算法·noi·子集卷积·sos dp·mod 异常
mit6.8244 小时前
presum|
算法