Word Search -- 回溯法--力扣101算法题解笔记

题目描述

给定一个字母矩阵,所有的字母都与上下左右四个方向上的字母相连接。给定一个字符串,求字符串能不能在字母矩阵中寻找到。

输入输出样例

Input :word = "ABCCED",

board = \['A','B','C','E', 'S','F','C','S',

'A','D','E','E'\]

Output:true

输入的是一个二维字符数组和一个字符串,输出的是一个bool值,表示字符串是否可以被寻找到

题解

大体的解决方法可以从左上角的'A'开始,我们可以先向右、再向下、再向左。找到连续的ABCCED

这个跟前面两个的排列组合问题又不太一样,这种题目不能去修改输出方式,而是要修改访问标记。在我们对任意的位置进行深度优先搜索的时候,要先标记当前位置为已访问,避免重复遍历。在所有可能的搜索都完成后,再改回当前位置未访问。防止干扰其他位置搜索到当前位置。使用回溯法的话,可以只对一个二维的访问矩阵进行修改,不用把每次的搜索状态作为一个新对象传入递归函数中。

cpp 复制代码
#include <vector>
#include <iostream>
using namespace std;

void backtracking(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;   //修改当前节点状态
    //递归遍历子节点们
    backtracking(i + 1, j, board, word, find, visited, pos + 1);
    backtracking(i - 1, j, board, word, find, visited, pos + 1);
    backtracking(i, j + 1, board, word, find, visited, pos + 1);
    backtracking(i, j - 1, board, word, find, visited, pos + 1);
    visited[i][j] = false;  //回改当前节点状态
}

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) {
            backtracking(i, j, board, word, find, visited, 0);
        }
    }
    return find;
}

int main() {
    vector<vector<char>> board = {
        {'A','B','C','E'},
        {'S','F','C','S'},
        {'A','D','E','E'}
    };
    string word = "ABCCED";
    cout << (exist(board, word) ? "true" : "false") << endl;
    return 0;
}
相关推荐
http阿拉丁神猫3 小时前
Go语言入门笔记:从基础到开发环境搭建(二)
开发语言·笔记·golang
HRBorderInsight6 小时前
马来西亚人均收入一个月多少钱,个人薪资和家庭收入要分开看
经验分享·笔记
又見山7 小时前
本地 Markdown 与数据主权:你的笔记到底属于谁
笔记·obsidian
撩得Android一次心动8 小时前
Jetpack Compose 知识点整理2【个人用】
android·笔记·学习·kotlin·compose
cao23339 小时前
关于 x1 y1 等变量名冲突的指正(校对版)
笔记
罗西的思考9 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer10 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
Demons_kirit10 小时前
CTFHub 信息泄露通关笔记:Git泄露 Log - 教程
笔记·git·网络安全
xhyu6111 小时前
【学习笔记】图像质量评估方法 (5.生成图像是否符合用户要求)
笔记·学习·计算机视觉
文丑颜不良啊11 小时前
LeetCode51~75题目解析
leetcode