劍指offer11_矩陣中的路徑

矩陣中的路徑


請設計一個函數,用來判斷在一個矩陣中是否存在一條路徑包含的字符按訪問順序連在一起恰好為給定字符串。

路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。

如果一條路徑經過了矩陣中的某一個格子,則之后不能再次進入這個格子。

注意:

  • 輸入的路徑字符串不為空;
  • 所有出現的字符均為大寫英文字母;
數據范圍

矩陣中元素的總個數 [0,900]。

路徑字符串的總長度 [1,900]。

樣例
matrix=
[["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]
]str="BCCE" , return "true" str="ASAE" , return "false"

題解

核心思想:深度優先搜索(DFS)結合回溯。

  1. 起點枚舉
    遍歷矩陣中的每一個單元格 (i, j) 作為可能的路徑起點。
  2. DFS遞歸搜索
    從起點出發,依次匹配字符串的每個字符。具體步驟如下:
    • 終止條件
      當前字符與目標字符不匹配,或已匹配完所有字符(u == str.size() - 1)。
    • 路徑探索
      向四個方向(上、右、下、左)擴展路徑,并跳過越界或已訪問的單元格。
    • 回溯恢復現場
      搜索結束后恢復當前單元格的原始字符,避免影響其他路徑的搜索。
時間復雜度分析
  • 起點數量:矩陣共有 m×n 個單元格,其中 m 為行數,n 為列數。
  • 路徑分支
    每個字符匹配后,最多有 3 個新方向可選(不能走回頭路),字符串長度為 k
  • 總時間復雜度
    O(m×n×3?),其中 k 為字符串長度。
class Solution {
public:bool hasPath(vector<vector<char>>& matrix, string str) {// 遍歷所有可能的起點for (int i = 0; i < matrix.size(); i++) {for (int j = 0; j < matrix[i].size(); j++) {if (dfs(matrix, str, 0, i, j)) {return true;}}}return false;}bool dfs(vector<vector<char>>& matrix, string& str, int u, int x, int y) {// 當前字符不匹配,直接返回falseif (matrix[x][y] != str[u]) return false;// 已匹配所有字符,返回trueif (u == str.size() - 1) return true;// 定義四個方向:上、右、下、左int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};// 保存當前字符并標記為已訪問char original = matrix[x][y];matrix[x][y] = '*'; // 使用特殊字符標記已訪問// 向四個方向遞歸搜索for (int i = 0; i < 4; i++) {int nx = x + dx[i], ny = y + dy[i];// 檢查新坐標是否越界if (nx >= 0 && nx < matrix.size() && ny >= 0 && ny < matrix[nx].size()) {if (dfs(matrix, str, u + 1, nx, ny)) {return true; // 找到路徑,提前返回}}}// 回溯:恢復當前單元格的原始字符matrix[x][y] = original;return false;}
};

代碼解釋
  1. 主函數 hasPath
    • 遍歷矩陣的每個單元格 (i, j),作為DFS的起點。
    • 若某一起點出發能找到完整路徑,立即返回 true
  2. 遞歸函數 dfs
    • 參數說明
      • u:當前需匹配的字符在字符串中的索引。
      • x, y:當前搜索的矩陣坐標。
    • 字符匹配檢查
      若當前單元格字符與目標字符不匹配,直接返回 false
    • 終止條件
      若已匹配所有字符(u == str.size() - 1),返回 true
    • 方向探索
      使用方向數組生成四個相鄰坐標,過濾越界位置后遞歸搜索。
    • 回溯恢復現場
      將標記為 * 的單元格恢復為原字符,確保后續路徑搜索不受影響。
關鍵細節
  • 避免重復訪問
    通過臨時修改當前單元格為特殊字符 *,確保同一路徑中不重復使用單元格。
  • 剪枝優化
    一旦某條路徑找到解,立即通過 return true 終止后續搜索,減少不必要的遞歸。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82576.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82576.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82576.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

騰訊2025年校招筆試真題手撕(三)

一、題目 今天正在進行賽車車隊選拔&#xff0c;每一輛賽車都有一個不可以改變的速度。現在需要選取速度差距在10以內的車隊&#xff08;車隊中速度的最大值減去最小值不大于10&#xff09;&#xff0c;用于迎賓。車隊的選拔按照的是人越多越好的原則&#xff0c;給出n輛車的速…

《三維點如何映射到圖像像素?——相機投影模型詳解》

引言 以三維投影介紹大多比較分散&#xff0c;不少小伙伴再面對諸多的坐標系轉換中容易弄混&#xff0c;特別是再寫代碼的時候可能搞錯&#xff0c;所有這篇文章幫大家完整的梳理3D視覺中的投影變換的全流程&#xff0c;一文弄清楚這個過程&#xff0c;幫助大家搞清坐標系轉換…

Ini配置文件讀寫,增加備注功能

1.增加備注項寫入 例: #節點備注 [A] #項備注 bbb1 ccc2 [B] bbb1 IniConfig2 ic new IniConfig2(); //首次寫入 if (!ic.CanRead()) { ic.AddSectionReMarke("A", "節點備注"); ic.SetValue("A&qu…

OpenHarmony 5.0中狀態欄添加以太網狀態欄圖標以及功能實現

目錄 1.前置條件 2.方案 1.前置條件 首先以太網接口是有問題的,如下按照如下流程將以太網接口進行修復 OpenHarmony 以太網卡熱插拔事件接口無效-CSDN博客 然后上述的接口可以了就可以通過這個接口獲取以太網是否連接狀態 要注意wifi連接的干擾和預置虛擬網口干擾 2.方案…

RNN GRU LSTM 模型理解

一、RNN 1. 在RNN中&#xff0c; 2. RNN是一個序列模型&#xff0c;與非序列模型不同&#xff0c;序列中的元素互相影響&#xff1a; 是由 計算得來的。 在前向傳播中&#xff1a; 用于計算 和 用于計算 和 因此&#xff0c;當進行反向鏈式法則求導時候&#xf…

多路徑傳輸(比如 MPTCP)控制實時突發

實時突發很難控制&#xff0c;因為 “實時” 和 “突發” 相互斥。實時要求避免排隊&#xff0c;而突發必然要排隊&#xff0c;最終的解決方案都指向找一個公說公有理&#xff0c;婆說婆有理的中間點&#xff0c;這并沒解決問題&#xff0c;只是權衡了問題。 這種局部解決問題的…

函數式編程思想詳解

函數式編程思想詳解 1. 核心概念 不可變數據 (Immutable Data) 數據一旦創建&#xff0c;不可修改。任何操作均生成新數據&#xff0c;而非修改原數據。 優點&#xff1a;避免副作用&#xff0c;提升并發安全&#xff0c;簡化調試。 Java實現&#xff1a;使用final字段、不可變…

iOS 主要版本發布歷史

截至 2025 年 5 月&#xff0c;iOS 的最新正式版本是 iOS 18&#xff0c;于 2024 年 9 月 16 日 正式發布。此前的 iOS 17 于 2023 年 9 月 18 日 發布&#xff0c;并在 2024 年被 iOS 18 取代。(維基百科) &#x1f4f1; iOS 主要版本發布歷史 以下是 iOS 各主要版本的發布日…

矩陣詳解:線性代數在AI大模型中的核心支柱

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

基于51單片機和8X8點陣屏、獨立按鍵的飛行躲閃類小游戲

目錄 系列文章目錄前言一、效果展示二、原理分析三、各模塊代碼1、8X8點陣屏2、獨立按鍵3、定時器04、定時器1 四、主函數總結 系列文章目錄 前言 用的是普中A2開發板。 【單片機】STC89C52RC 【頻率】12T11.0592MHz 【外設】8X8點陣屏、獨立按鍵 效果查看/操作演示&#xff…

區塊鏈可投會議CCF C--APSEC 2025 截止7.13 附錄用率

Conference&#xff1a;32nd Asia-Pacific Software Engineering Conference (APSEC 2025) CCF level&#xff1a;CCF C Categories&#xff1a;軟件工程/系統軟件/程序設計語言 Year&#xff1a;2025 Conference time&#xff1a;December 2-5, 2025 in Macao SAR, China …

pdf圖片導出(Visio\Origin\PPT)

一、Visio 導入pdf格式圖片 1. 設計->大小&#xff0c;適應繪圖。 2. 文件->導出&#xff0c;導出為pdf格式。 上面兩部即可得到只包含圖的部分的pdf格式。 如果出現的有默認白邊&#xff0c;可以通過以下方式設置&#xff1a; 1. 文件->選項->自定義功能區->…

vector的實現

介紹 1. 本質與存儲結構 動態數組實現&#xff1a;vector 本質是動態分配的數組&#xff0c;采用連續內存空間存儲元素&#xff0c;支持下標訪問&#xff08;如 vec[i]&#xff09;&#xff0c;訪問效率與普通數組一致&#xff08;時間復雜度 O (1)&#xff09;。動態擴容機制&…

【Linux筆記】防火墻firewall與相關實驗(iptables、firewall-cmd、firewalld)

一、概念 1、防火墻firewall Linux 防火墻用于控制進出系統的網絡流量&#xff0c;保護系統免受未授權訪問。常見的防火墻工具包括 iptables、nftables、UFW 和 firewalld。 防火墻類型 包過濾防火墻&#xff1a;基于網絡層&#xff08;IP、端口、協議&#xff09;過濾流量&a…

el-date-picker 前端時間范圍選擇器

控制臺參數&#xff1a; 前端代碼&#xff1a;用數組去接受&#xff0c;同時用 value-format"YYYY-MM-DD" 格式化值為&#xff1a;年月日格式 <!-- 查詢區域 --><transition name"fade"><div class"search" v-show"showSe…

在 macOS 上安裝 jenv 管理 JDK 版本

在 macOS 上安裝 jenv 并管理 JDK 版本 在開發 Java 應用程序時&#xff0c;你可能需要在不同的項目中使用不同版本的 JDK。手動切換 JDK 版本可能會很繁瑣&#xff0c;但幸運的是&#xff0c;有一個工具可以簡化這個過程&#xff1a;jenv。jenv 是一個流行的 Java 版本管理工…

2025年全國青少年信息素養大賽復賽C++集訓(16):吃糖果2(題目及解析)

2025年全國青少年信息素養大賽復賽C集訓&#xff08;16&#xff09;&#xff1a;吃糖果2&#xff08;題目及解析&#xff09; 題目描述 現有n(50 > n > 0)個糖果,每天只能吃2個或者3個&#xff0c;請計算共有多少種不同的吃法吃完糖果。 時間限制&#xff1a;1000 內存…

ARM筆記-嵌入式系統基礎

第一章 嵌入式系統基礎 1.1嵌入式系統簡介 1.1.1嵌入式系統定義 嵌入式系統定義&#xff1a; 嵌入式系統是以應用為中心&#xff0c;以計算機技術為基礎&#xff0c;軟硬件可剪裁&#xff0c;對功能、可靠性、成本、體積、功耗等有嚴格要求的專用計算機系統 ------Any devic…

大語言模型(LLM)入門項目推薦

推薦大語言模型(LLM)的入門項目 TiaoYu-1。 https://github.com/tiaoyu1122/TiaoYu-1 項目優點&#xff1a; 幾乎每一行代碼(一些重復的代碼除外)都添加了注釋&#xff0c;詳細介紹了代碼的作用&#xff0c;方便閱讀與理解。基本上覆蓋了常見 LLM 模型的全部訓練流程&#x…

Linux里more 和 less的區別

在 Linux/Unix 系統中&#xff0c;more 和 less 都是用于分頁查看文本文件的命令&#xff0c;但 less 是 more 的增強版&#xff0c;功能更強大。以下是它們的核心區別和用法對比&#xff1a; 1. 基礎功能對比 特性moreless&#xff08;更強大&#xff09;向前翻頁? 僅支持向…