LeetCode 212.單詞搜索II

https://leetcode.cn/problems/word-search-ii/description/?envType=study-plan-v2&envId=top-interview-150

文章目錄

  • 題目描述
  • 解題思路
  • 代碼實現

題目描述

給定一個 m x n 二維字符網格 board 和一個單詞(字符串)列表 words, 返回所有二維網格上的單詞 。

單詞必須按照字母順序,通過 相鄰的單元格 內的字母構成,其中“相鄰”單元格是那些水平相鄰或垂直相鄰的單元格。同一個單元格內的字母在一個單詞中不允許被重復使用。

示例 1:

輸入:board = [[“o”,“a”,“a”,“n”],[“e”,“t”,“a”,“e”],[“i”,“h”,“k”,“r”],[“i”,“f”,“l”,“v”]], words = [“oath”,“pea”,“eat”,“rain”]
輸出:[“eat”,“oath”]
示例 2:

輸入:board = [[“a”,“b”],[“c”,“d”]], words = [“abcb”]
輸出:[]

提示:

m == board.length
n == board[i].length
1 <= m, n <= 12
board[i][j] 是一個小寫英文字母
1 <= words.length <= 3 * 104
1 <= words[i].length <= 10
words[i] 由小寫英文字母組成
words 中的所有字符串互不相同

解題思路

我們使用字典樹把words中的所有單詞存起來,同時為了便于查找子節點,我們的字典樹實現的時候,可以把子節點的實現方式換位HashMap<Integer, String>這樣可以實現快速查找,而且可以按需建立子節點

然后對我們的board進行dfs遍歷,查找當前遍歷的字符串是否在字典樹中

  • 剪枝:每當當前訪問的節點不是字典樹中的任意一個單詞的前綴,剪掉
  • 去重:同一個單詞可能在多個不同的路徑出現,所以使用哈希集合對結果去重。
  • dfs遍歷當前節點之前,可以修改當前節點為’#', 遍歷完在恢復
  • 優化:刪除匹配的單詞,考慮以下情況。假設給定一個所有單元格都是 a 的二維字符網格和單詞列表 [“a”, “aa”, “aaa”, “aaaa”] 。當我們使用方法一來找出所有同時在二維網格和單詞列表中出現的單詞時,我們需要遍歷每一個單元格的所有路徑,會找到大量重復的單詞。

代碼實現

class Solution {int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};public List<String> findWords(char[][] board, String[] words) {Trie trie = new Trie();for(String word: words) {   // 插入字典樹trie.insert(word);}Set<String> ans = new HashSet<String>();  // 結果集去重for(int i=0; i<board.length; i++){for(int j=0; j<board[0].length; j++){dfs(board, trie,i,j,ans);      // dfs}}return new ArrayList<String>(ans);}public void dfs(char[][] board, Trie now , int i1, int j1, Set<String> ans){if(!now.children.containsKey(board[i1][j1])){   // 剪枝return;}char ch = board[i1][j1];now = now.children.get(ch);if(!"".equals(now.word)){ans.add(now.word);now.word = "";     // 優化,這樣省的去重}board[i1][j1] = '#';for(int[] dir: dirs){int i2 = i1 + dir[0];int j2 = j1 + dir[1];if(i2 >= 0 && i2 < board.length && j2 >= 0 && j2 < board[0].length){dfs(board, now, i2, j2, ans);}}board[i1][j1] = ch;}
}class Trie{String word;Map<Character, Trie> children;    // 子節點實現方式換位hashMap// boolean isWord; // 這里暫時沒用public Trie(){this.word = "";this.children = new HashMap<Character, Trie>();}public void insert(String word){Trie cur = this;for(int i=0; i< word.length(); i++){char c = word.charAt(i);if(!cur.children.containsKey(c)){cur.children.put(c, new Trie());}cur = cur.children.get(c);}cur.word = word;}
}

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

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

相關文章

#OD314. 解密犯罪時間

題目描述 警察在偵破一個案件時&#xff0c;得到了線人給出的可能犯罪時間&#xff0c;形如 “HH:MM” 表示的時刻。 根據警察和線人的約定&#xff0c;為了隱蔽&#xff0c;該時間是修改過的&#xff0c; 解密規則為&#xff1a;利用當前出現過的數字&#xff0c;構造下一個…

geotrust dv通配符證書800

Geotrust是成立時間較久的正規CA認證機構&#xff0c;在過去的幾十年間頒發了無數的SSL證書&#xff0c;這些SSL證書被各個開發者使用&#xff0c;受到大多數瀏覽器的信任。而Geotrust旗下的DV通配符證書因其廣泛的應用范圍受到了用戶的青睞。今天就隨SSL盾小編了解Geotrust旗下…

Ardupilot Rpanion iperf網絡性能測試

Ardupilot Rpanion iperf網絡性能測試 1. 源由2. 分析3. 安裝4. 測試4.1 第一次測試4.1.1 iperf測試參數A4.1.1.1 測試鏈路14.1.1.2 測試鏈路24.1.1.3 測試鏈路3 4.1.2 iperf測試參數B - 測試鏈路34.1.2.1 測試數據4.1.2.2 數據簡單分析4.1.2.3 數據深入分析4.1.2.4 模擬測試網…

Vue 中使用 el-date-picker 限制只能選擇當天、當天之前或當天之后日期的方法詳解

網上很多都是不完整的&#xff0c;我這里發布一個完整的 - 8.64e7 表示可選擇當天時間&#xff08;注&#xff1a;小于當前時間&#xff0c;- 8.64e7 則是禁用日期不包含當前日&#xff0c;若大于當前日期&#xff0c; 8.64e7 則是禁用日期包含當前日&#xff09; time.getTi…

c++ 讀寫鎖的理解

1.概要 讀寫鎖的理解 讀的時候&#xff0c;只要是讀的線程都不受限制&#xff0c;但不能寫。 寫的時候&#xff0c;線程獨占&#xff0c;任何寫和讀的線程都不可以。 最初我以為&#xff0c;只有限制寫就可以了&#xff0c;讀完全不受現在&#xff0c;但是有可能讀到不完整的…

【初始類和對象】(實例講解!超級詳細!)

【初始類和對象】 前言1. 面向對象的初步認知1.1什么是面向對象1.2 面向對象與面向過程 2. 類的定義和使用2.1 簡單認識類2.2 類的定義格式 3. 知識的代碼舉例講解3.1 創建類、實例化類3.2 構造方法初始化類、this 3. 總結 前言 由于類和對象是我們在學習過程中需要接受的概念…

AI賦能未來教育:中國教學科研新藍圖

設“人啊 前言 回顧過去&#xff0c;傳統的教育模式以知識灌輸和應試為主&#xff0c;雖培養出大量人才&#xff0c;但也存在著學生創新能力不足、實踐經驗缺乏等問題。隨著時代的進步和科技的發展&#xff0c;傳統教育模式已難以滿足當今社會對人才的需求。然而&#xff0c;當…

LoadIncrementalHFiles 流程和原理

目錄 1. HBase Bulk Load 簡介 2. 流程 3. 原理 4. 使用注意事項 5.補充說明之"什么是移動文件" 1. HBase Bulk Load 簡介 LoadIncrementalHFiles是用于HBase的Bulk Load工具&#xff0c;允許用戶高效地將大量數據直接加載到HBase表中&#xff0c;而不是使用傳…

中國現代十大杰出人物顏廷利:好的司機不如好的同機

找好‘同機’者, 要比找好‘司機’者, 原因就是, ‘司機’雖好, 但不是‘同路人’, 再多努力的攀附都是徒勞, 至于‘同機’者, 即便是對方在自己的眼里心中都一無是處, 只不過, 他/她才是您旅途之中, 真真正正、風雨同舟的人…(升命學說) 21世紀東方哲學家思想家、科學家、當代…

孩子學編程和不學編程的差距?

隨著信息技術的飛速發展&#xff0c;編程已經成為一項非常重要的技能&#xff0c;不僅僅是在計算機領域&#xff0c;而且在各個行業都有著廣泛的應用。因此&#xff0c;讓孩子學習編程已經成為很多家長的選擇。那么&#xff0c;孩子學習編程和不學習編程之間有哪些差距呢&#…

TODESK遠控快捷鍵在哪里

在當今高度數字化的世界中&#xff0c;遠程工作和協作已經成為日常生活和業務運營的重要組成部分。Todesk作為一款出色的遠程協作軟件&#xff0c;為用戶提供了諸多功能&#xff0c;以確保流暢、高效的遠程連接體驗。其中&#xff0c;快捷鍵功能極大地提升了用戶的操作便捷性。…

高速、簡單、安全的以太彩光,銳捷網絡發布極簡以太全光 3.X 方案

從 2021 年 3 月正式推出到現在&#xff0c;銳捷網絡極簡以太全光方案已經走進第四個年頭。IT 仍在不斷向前發展&#xff0c;數字化進程深入&#xff0c;數字化業務增多&#xff0c;更廣泛的終端設備接入企業級園區網絡&#xff0c;對園區網絡提出了更高的要求&#xff0c;例如…

GDB斷點執行的次數

需求背景&#xff1a;條件斷點可能執行多次&#xff0c;但是可能在最后一次執行引發了后續的問題&#xff0c;但是斷點位置并非問題現場&#xff0c;如何使得斷點在最后一次停下來&#xff1f; 方法&#xff1a; 1.首先設置條件斷點 (gdb) b (gdb) cond breakpoint_number…

Linux NFS共享目錄配置漏洞

Linux NFS共享目錄配置漏洞 一、實驗目的二、實驗原理三、復現準備四、漏洞復現4.1、復現前提4.2、正式復現 一、實驗目的 利用 NFS共享目錄配置漏洞讀取目標主機的 /etc/passwd 文件內容NFS 服務配置漏洞&#xff0c;賦予了根目錄遠程可寫權限&#xff0c;導致 /root/.ssh/au…

關系型數據庫VS非關系型數據庫

數據庫是存儲和組織數據的系統&#xff0c;主要分為兩大類&#xff1a; 關系型數據庫&#xff08;Relational Database Management Systems, RDBMS&#xff09; 非關系型數據庫&#xff08;NoSQL Databases&#xff09; 下面分別介紹這些類型及其區別&#xff1a; 關系型數…

im8mm 網絡卡死 Rx packets:1037578 errors:66 dropped:0 overruns:66 frame:0

1&#xff1a;網絡接收數據包異常 2&#xff1a;問題復現 問題在進行網絡數據包同吞吐量測試的時候出現的。同時發現&#xff0c;在使用iperf2測試時&#xff0c;是不會出現網絡中斷卡死的情況&#xff0c;使用 iperf3時才會出現此問題 指令(下面的指令運行在PC2上面&#xff…

AGV混合型電機驅動器|伺服控制器CNS-MI50H系列對電機的要求

混合型電機驅動器 CNS-MI50H系列涵蓋CNS-MI50HB-A、CNS-MI50HBN-A、CNS-MI50HDN-A、CNS-MI50HSN-A型號&#xff0c;專為 AGV 舵輪控制需求設計&#xff0c;集成舵輪轉向角度控制和驅動電機閉環控制。支持增量式編碼器&#xff0c;霍爾傳感器&#xff0c; 角度電位計&#xff0c…

自動化測試基礎 --- Jmeter

前置環境安裝 首先我們需要知道如何下載Jmeter 這里貼上下載網站Apache JMeter - Download Apache JMeter 我們直接解壓,然后在bin目錄下找到jemter.bat即可啟動使用 成功打開之后就是這個界面 每次打開可以用這種方式切換成簡體中文 或者直接修改properties文件修改對應的語言…

目標檢測算法YOLOv8簡介

YOLOv8論文尚未發布&#xff0c;YOLOv8由Ultralytics公司推出并維護&#xff0c;源碼見&#xff1a;https://github.com/ultralytics/ultralytics &#xff0c;于2024年1月發布v8.1.0版本&#xff0c;最新發布版本為v8.2.0&#xff0c;License為AGPL-3.0。 以下內容主要來自&am…

FFmpeg 中 -f 命令參數詳解

FFmpeg FFmpeg是一個開源的、功能強大的多媒體框架,它能夠處理幾乎所有格式的音頻和視頻文件。FFmpeg由Fabrice Bellard創立,并由Michael Niedermayer等人繼續開發。它包括了libavcodec(用于編解碼)、libavformat(用于格式轉換)、libavfilter(用于音視頻過濾)、libavd…