day65—回溯—单词搜索(LeetCode-79)

发布于:2025-06-14 ⋅ 阅读:(16) ⋅ 点赞:(0)

题目描述

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

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

示例 1:

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

示例 2:

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

示例 3:

输入: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
  • board 和 word 仅由大小写英文字母组成

解决方案:

1、越界检查

2、终止条件:字符符合,字符串长度达到,该位置已遍历

3、单层循环逻辑:pos + 1,上下左右四方向判断

函数源码:

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        if(board.empty())   return false;

        int m=board.size(),n=board[0].size();

        vector<vector<bool>> visited(m,vector<bool>(n,false));
        bool find=false;

        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                back(i,j,board,word,find,visited,0);
            }
        }
        return find;
    }

    void back(int i,int j,vector<vector<char>>& board,string word,bool& find, vector<vector<bool>>&visited,int pos){
        if(i<0 || i>=board.size() || j<0 || j>=board[0].size())     return;

        if(visited[i][j] || find || board[i][j] != word[pos])       return;

        if(pos == word.size()-1){
            find=true;
            return;
        }

        visited[i][j]=true; //已遍历

        back(i+1,j,board,word,find,visited,pos+1);
        back(i-1,j,board,word,find,visited,pos+1);
        back(i,j-1,board,word,find,visited,pos+1);
        back(i,j+1,board,word,find,visited,pos+1);
        
        visited[i][j] = false;

    }



};