LeetCode 127:單詞接龍

LeetCode 127:單詞接龍

在這里插入圖片描述

問題本質:最短轉換序列的長度

給定兩個單詞 beginWordendWord,以及字典 wordList,要求找到從 beginWordendWord最短轉換序列(每次轉換僅改變一個字母,且中間單詞必須在 wordList 中),返回序列的單詞數;若無法轉換,返回 0

核心思路:廣度優先搜索(BFS)

BFS 天然適合解決最短路徑問題,因為它按層次遍歷,第一次到達目標節點時的層數即為最短路徑長度。

關鍵觀察:
  1. 鄰居生成:每個單詞的“鄰居”是改變一個字母后得到的所有可能單詞(需在 wordList 中)。
  2. 去重處理:用集合記錄已訪問的單詞,避免重復處理(否則會導致無限循環或超時)。

算法步驟詳解

步驟 1:預處理與邊界檢查
  • wordList 轉換為 HashSet,確保查找時間為 O(1)
  • endWord 不在 wordList 中,直接返回 0(無法轉換)。
步驟 2:初始化 BFS
  • 隊列:存儲當前處理的單詞及當前步數(通過分層遍歷實現,隊列中同一層的單詞對應相同步數)。
  • 訪問集合:記錄已處理的單詞,避免重復入隊。
  • 初始狀態:將 beginWord 入隊,步數為 1beginWord 是序列的第一個單詞)。
步驟 3:分層遍歷(BFS 核心)
  1. 遍歷當前層:每次取出隊列中當前層的所有單詞(通過 queue.size() 獲取層大小)。
  2. 生成鄰居:對每個單詞,遍歷其每個字符位置,嘗試替換為 a-z 中除原字符外的所有可能,生成新單詞。
  3. 檢查終止條件:若新單詞是 endWord,直接返回 當前步數 + 1(新單詞是下一層,步數加1)。
  4. 合法鄰居入隊:若新單詞在 wordList 中且未被訪問,標記為已訪問并加入隊列。
步驟 4:處理剩余情況

若遍歷完所有可能仍未找到 endWord,返回 0

完整代碼(Java)

import java.util.*;class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {// 1. 預處理:轉換為集合,加速查找Set<String> wordSet = new HashSet<>(wordList);// 邊界檢查:endWord 不在字典中,直接返回 0if (!wordSet.contains(endWord)) {return 0;}// 2. 初始化 BFS:隊列(存儲單詞)、訪問集合、步數Queue<String> queue = new LinkedList<>();Set<String> visited = new HashSet<>();queue.offer(beginWord);visited.add(beginWord);int step = 1; // beginWord 是第一個單詞,步數初始為 1// 3. 分層遍歷while (!queue.isEmpty()) {int currentLevelSize = queue.size(); // 當前層的單詞數量for (int i = 0; i < currentLevelSize; i++) {String currentWord = queue.poll();// 生成所有可能的鄰居(改變一個字母)for (int j = 0; j < currentWord.length(); j++) {// 嘗試替換為 a-z 中除原字符外的所有字母for (char c = 'a'; c <= 'z'; c++) {if (c == currentWord.charAt(j)) {continue; // 跳過原字符,保證只改變一個字母}// 構造新單詞StringBuilder sb = new StringBuilder(currentWord);sb.setCharAt(j, c);String newWord = sb.toString();// 終止條件:找到 endWord,返回步數+1if (newWord.equals(endWord)) {return step + 1;}// 合法鄰居:在字典中且未被訪問if (wordSet.contains(newWord) && !visited.contains(newWord)) {visited.add(newWord);queue.offer(newWord);}}}}step++; // 處理完當前層,步數加 1}// 4. 遍歷結束仍未找到,返回 0return 0;}
}

關鍵細節解析

  1. 鄰居生成優化
    對每個字符位置,遍歷 26 個字母(跳過原字符),確保僅改變一個字母。時間復雜度為 O(L×26)L 是單詞長度,最多為 10),高效可控。

  2. 分層遍歷的意義
    通過 queue.size() 分層處理,保證每次處理的是同一步數的單詞,確保第一次到達 endWord 時的步數是最小值

  3. 去重的必要性
    若不標記已訪問,同一單詞可能被多次入隊,導致時間復雜度過高(例如,hot 可能被不同路徑多次生成)。

復雜度分析

  • 時間復雜度O(N×L×26),其中 NwordList 的長度(最多 5000),L 是單詞長度(最多 10)。每個單詞生成 L×25 個鄰居(排除原字符),整體可接受。
  • 空間復雜度O(N),隊列和訪問集合最多存儲 N 個單詞。

示例驗證

示例 1

  • 輸入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
  • 過程:hit → hot → dot → dog → cog,共 5 步。代碼中,當處理 dog 時生成 cog,返回 step + 1 = 4 + 1 = 5,符合預期。

示例 2

  • 輸入:endWord 不在 wordList 中,直接返回 0

該方案通過 BFS 層次遍歷 高效求解最短路徑,利用集合優化查找和去重,確保了算法的正確性與性能,是處理“單詞接龍”類問題的經典思路。

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

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

相關文章

docker搭建ray集群

1. 安裝docker 已安裝過docker 沒安裝流程 啟動 Docker 服務&#xff1a; sudo systemctl start docker sudo systemctl enable docker # 設置開機即啟動docker驗證 Docker 是否安裝成功&#xff1a; docker --version2. 部署ray # 先停止docker服務 systemctl stop docker…

【iOS】SideTable

文章目錄前言1??Side Table 的核心作用&#xff1a;擴展對象元數據存儲1.1 傳統對象的內存限制1.2 Side Table 的定位&#xff1a;集中式元數據倉庫2??Side Table 的底層結構與關聯2.1 Side Table 與 isa 指針的關系2.2 Side Table 的存儲結構2.3 SideTable 的工作流程3??…

【Spring Cloud Gateway 實戰系列】高級篇:服務網格集成、安全增強與全鏈路壓測

一、服務網格集成&#xff1a;Gateway與Istio的協同作戰在微服務架構向服務網格演進的過程中&#xff0c;Spring Cloud Gateway可與Istio形成互補——Gateway負責南北向流量&#xff08;客戶端到集群&#xff09;的入口管理&#xff0c;Istio負責東西向流量&#xff08;集群內服…

一文說清楚Hive

Hive作為Apache Hadoop生態的核心數據倉庫工具&#xff0c;其設計初衷是為熟悉SQL的用戶提供大規模數據離線處理能力。以下從底層計算框架、優點、場景、注意事項及實踐案例五個維度展開說明。 一、Hive底層分布式計算框架對比 Hive本身不直接執行計算&#xff0c;而是將HQL轉換…

SeaweedFS深度解析(三):裸金屬單機和集群部署

#作者&#xff1a;閆乾苓 文章目錄2.2.4 S3 Server&#xff08;兼容 Amazon S3 的接口&#xff09;2.2.5 Weed&#xff08;命令行工具&#xff09;3、裸金屬單機和集群部署3.1 裸金屬單機部署3.1.1安裝 SeaweedFS3.1.2 以Master模式啟動2.2.4 S3 Server&#xff08;兼容 Amazon…

相機ROI 參數

相機的 ROI&#xff08;Region of Interest&#xff0c;感興趣區域&#xff09; 參數&#xff0c;是指通過設置圖像傳感器上 特定區域 作為有效成像區域&#xff0c;從而只采集該區域的圖像數據&#xff0c;而忽略其他部分。這一功能常用于工業相機、科研相機、高速相機等場景&…

Vue基礎(24)_VueCompinent構造函數、Vue實例對象與組件實例對象

分析上一節代碼中的school組件&#xff1a;該組件是一個名為VueCompinent的構造函數。截取部分vue.js源碼&#xff0c;分析Vue.extend&#xff1a;// 定義一個名為VueComponent的構造函數對象Sub&#xff0c;往Sub對象調用_init(options)方法&#xff0c;參數為配置項&#xff…

螢石云替代產品攝像頭方案螢石云不支持TCP本地連接-東方仙盟

不斷試錯東方仙盟深耕科研測評&#xff0c;聚焦前沿領域&#xff0c;以嚴謹標準評估成果&#xff0c;追蹤技術突破&#xff0c;在探索與驗證中持續精進&#xff0c;為科研發展提供參考&#xff0c;助力探路前行 螢石云價格螢石云的不便于使用 家庭場景&#xff1a;成本可控與隱…

C51:用DS1302時鐘讀取和設置時間

因為在ds1302.c文件中包含了寫ds1302&#xff08;51向ds1302寫數據&#xff09;和讀ds1302&#xff08;51從ds1302讀數據&#xff09;的兩個函數&#xff0c;我們根據文件中提供的函數來寫讀取時間和設置時間的函數即可ds1302.c文件源碼如下&#xff0c;需要的同學可以參考一下…

webrtc整體架構

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一套支持瀏覽器和移動應用進行實時音視頻通信的開源技術標準&#xff0c;其架構設計圍繞 “實時性”“低延遲”“跨平臺” 和 “安全性” 展開&#xff0c;整體可分為核心引擎層、API 層、支撐服務層三大部分&…

淺析PCIe 6.0 ATS地址轉換功能

在現代高性能計算和虛擬化系統中,地址轉換(Address Translation)是一個至關重要的機制。隨著 PCIe 設備(如 GPU、網卡、存儲控制器)直接訪問系統內存的能力增強,設備對虛擬內存的訪問需求日益增長。 為了提升性能并確保安全訪問,Address Translation Services(ATS) 應…

【前端】ikun-pptx編輯器前瞻問題二: pptx的壓縮包結構,以及xml正文樹及對應元素介紹

文章目錄PPTX文件本質&#xff1a;一個壓縮包核心文件解析1. 幻燈片內容文件 (ppt/slides/slideX.xml)2. 元素類型解析文本框元素 (p:sp)圖片元素 (p:pic)單位系統開發注意事項參考工具pptx渲染路線圖PPTX文件本質&#xff1a;一個壓縮包 PPTX文件實際上是一個遵循Open XML標準…

分布式任務調度實戰:XXL-JOB與Elastic-Job深度解析

告別傳統定時任務的局限&#xff0c;擁抱分布式調度的強大與靈活 在現代分布式系統中&#xff0c;高效可靠的任務調度已成為系統架構的核心需求。面對傳統方案&#xff08;如Timer、Quartz&#xff09;在分布式環境下的不足&#xff0c;開發者急需支持集群調度、故障轉移和可視…

Windows 11下純軟件模擬虛擬機的設備模擬與虛擬化(僅終端和網絡)

Windows 11下用GCC的C代碼實現的虛擬機需要終端輸入/輸出&#xff08;如串口或虛擬控制臺&#xff09;和網絡連接&#xff0c;但不需要完整的硬件設備&#xff08;如磁盤、顯卡、USB 等&#xff09;。在終端輸入/輸出方面&#xff0c;參考qemu的源代碼&#xff0c;但不調用qemu…

CCF-GESP 等級考試 2025年6月認證Python六級真題解析

1 單選題&#xff08;每題 2 分&#xff0c;共 30 分&#xff09;第1題 下列哪一項不是面向對象編程&#xff08;OOP&#xff09;的基本特征&#xff1f;&#xff08; &#xff09;A. 繼承 (Inheritance) B. 封裝 (Encapsul…

C++中的deque

1. 什么是 Deque&#xff1f; 核心概念&#xff1a; Deque 是 “Double-Ended Queue”&#xff08;雙端隊列&#xff09;的縮寫。你可以把它想象成一個可以在兩端&#xff08;頭部和尾部&#xff09;高效地進行添加或刪除操作的線性數據結構。關鍵特性&#xff1a; 雙端操作&am…

GNU到底是什么,與Unix和Linux是什么關系

GNU&#xff08;發音為 /ɡnu?/&#xff0c;類似“革奴”&#xff09;是一個自由軟件操作系統項目&#xff0c;由理查德斯托曼&#xff08;Richard Stallman&#xff09;于1983年發起&#xff0c;目標是創建一個完全由自由軟件組成的類Unix操作系統。它的名字是一個遞歸縮寫&a…

雙指針算法介紹及使用(下)

在上一篇文章中我們已經對雙指針有了一定了解&#xff0c;接下來我們通過題目來對雙指針進行更好的理解。 1. leetcode 202. 快樂數 這道題使用的方法是快慢指針&#xff0c; 比如說一個數X&#xff0c;那么創建兩個變量X1和X2&#xff0c;然后X1每次變化兩次&#xff0c;X2變化…

Elasticsearch整合:Repository+RestClient雙模式查詢優化

Elasticsearch整合&#xff1a;RepositoryRestClient雙模式查詢優化Elasticsearch 雙模式查詢優化&#xff1a;Repository RestClient 整合指南一、架構設計&#xff1a;雙模式協同工作流二、Repository 模式&#xff1a;快速開發最佳實踐2.1 基礎配置2.2 高級特性&#xff1a…

Elasticsearch 高級查詢語法 Query DSL 實戰指南

目錄 1、DSL 概述 1.1 DSL按照查詢的結構層次劃分 1.2 DSL按照檢索功能的用途和特性劃分 1.3 示例數據準備 2、match_all ——匹配所有文檔 3、精確匹配 3.1 term——單字段精確匹配查詢 3.2 terms——多值精確匹配 3.3 range——范圍查詢 3.4 exists——是否存在查詢…