LeetCode hot 100—編輯距離

題目

給你兩個單詞?word1?和?word2,?請返回將?word1?轉換成?word2?所使用的最少操作數??。

你可以對一個單詞進行如下三種操作:

  • 插入一個字符
  • 刪除一個字符
  • 替換一個字符

示例

示例?1:

輸入:word1 = "horse", word2 = "ros"
輸出:3
解釋:
horse -> rorse (將 'h' 替換為 'r')
rorse -> rose (刪除 'r')
rose -> ros (刪除 'e')

示例?2:

輸入:word1 = "intention", word2 = "execution"
輸出:5
解釋:
intention -> inention (刪除 't')
inention -> enention (將 'i' 替換為 'e')
enention -> exention (將 'n' 替換為 'x')
exention -> exection (將 'n' 替換為 'c')
exection -> execution (插入 'u')

分析

這是一個經典的動態規劃問題,也叫萊文斯坦距離(Levenshtein distance)。可以使用動態規劃的方法來求解將?word1?轉換成?word2?所使用的最少操作數。

動態規劃

算法思路

定義狀態
設?dp[i][j]?表示將?word1?的前?i?個字符轉換成?word2?的前?j?個字符所需要的最少操作數。這里?i?和?j?的范圍分別是從?0?到?word1.length()?和?word2.length()

初始化邊界條件

  • 當?i = 0?時,意味著?word1?為空字符串,那么將空字符串轉換成?word2?的前?j?個字符需要?j?次插入操作,所以?dp[0][j] = j
  • 當?j = 0?時,意味著?word2?為空字符串,那么將?word1?的前?i?個字符轉換成空字符串需要?i?次刪除操作,所以?dp[i][0] = i

狀態轉移方程

  • 如果?word1[i - 1] == word2[j - 1],說明當前字符相等,不需要進行額外操作,那么?dp[i][j] = dp[i - 1][j - 1]
  • 如果?word1[i - 1] != word2[j - 1],則可以進行三種操作:
  • 插入操作:要使?word1?的前?i?個字符變成?word2?的前?j?個字符,可以先讓?word1?的前?i?個字符變成?word2?的前?j - 1?個字符,再插入一個字符,即?dp[i][j] = dp[i][j - 1] + 1
  • 刪除操作:先讓?word1?的前?i - 1?個字符變成?word2?的前?j?個字符,再刪除?word1?的第?i?個字符,即?dp[i][j] = dp[i - 1][j] + 1
  • 替換操作:先讓?word1?的前?i - 1?個字符變成?word2?的前?j - 1?個字符,再將?word1?的第?i?個字符替換成?word2?的第?j?個字符,即?dp[i][j] = dp[i - 1][j - 1] + 1
  • 綜合這三種操作,取最小值作為?dp[i][j]?的值,即?dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1)

最終結果
最終結果為?dp[word1.length()][word2.length()],即把?word1?的全部字符轉換成?word2?的全部字符所需的最少操作數。

時間復雜度:O(mn),m?是?word1?的長度,n?為?word2?的長度

空間復雜度:O(mn)

class Solution {
public:int minDistance(std::string word1, std::string word2) {int m = word1.length();int n = word2.length();// 創建 dp 數組std::vector<std::vector<int>> dp(m + 1, std::vector<int>(n + 1, 0));// 初始化for (int i = 0; i <= m; ++i) {dp[i][0] = i;}for (int j = 0; j <= n; ++j) {dp[0][j] = j;}// 填充 dp 數組for (int i = 1; i <= m; ++i) {for (int j = 1; j <= n; ++j) {if (word1[i - 1] == word2[j - 1]) {dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = std::min({dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]}) + 1;}}}return dp[m][n];}
};    

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

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

相關文章

2.3 Spark運行架構與流程

Spark運行架構與流程包括幾個核心概念&#xff1a;Driver負責提交應用并初始化作業&#xff0c;Executor在工作節點上執行任務&#xff0c;作業是一系列計算任務&#xff0c;任務是作業的基本執行單元&#xff0c;階段是一組并行任務。Spark支持多種運行模式&#xff0c;包括單…

NO.82十六屆藍橋杯備戰|動態規劃-從記憶化搜索到動態規劃|下樓梯|數字三角形(C++)

記憶化搜索 在搜索的過程中&#xff0c;如果搜索樹中有很多重復的結點&#xff0c;此時可以通過?個"備忘錄"&#xff0c;記錄第?次搜索到的結果。當下?次搜索到這個結點時&#xff0c;直接在"備忘錄"??找結果。其中&#xff0c;搜索樹中的?個?個結點…

使用 VBA 宏創建一個選擇全部word圖片快捷指令,進行圖片格式編輯

使用 VBA 宏批量選擇圖片 ? 第一步&#xff1a;創建 .dotm 加載項文件 1、使用環境 office word 365&#xff0c;文件格式為.docx 圖片格式為.PNG 2、創建 .dotm 加載項文件 打開 Word&#xff0c;新建一個空白文檔。 按下 Alt F11 打開 VBA 編輯器。 點擊菜單欄&#xff…

深度學習的下一個突破:從圖像識別到情境理解

引言 過去十年&#xff0c;深度學習在圖像識別領域取得了驚人的突破。從2012年ImageNet大賽上的AlexNet&#xff0c;到后來的ResNet、EfficientNet&#xff0c;再到近年來Transformer架構的崛起&#xff0c;AI已經能在許多任務上超越人類&#xff0c;比如人臉識別、目標檢測、醫…

使用dyn4j做碰撞檢測

文章目錄 前言一、環境準備添加依賴基本概念 二、實現步驟1.創建世界2.添加物體3.設置碰撞監聽器4.更新世界 三、完整代碼示例四、優化補充總結 前言 dyn4j 提供了高效的碰撞檢測和物理模擬功能&#xff0c;適用于游戲開發、動畫制作以及其他需要物理交互的場景。通過簡單的 A…

VS Code settings.json 文件中常用的預定義變量?及其用途說明

VS Code settings.json 常用預定義變量 以下是 Visual Studio Code 配置文件中常用的預定義變量列表&#xff1a; 1. 工作區相關變量 變量描述示例值${workspaceFolder}當前工作區根目錄的絕對路徑C:/projects/my-project${workspaceFolderBasename}工作區文件夾名稱&#x…

elasticSearch-搜索引擎

搜索引擎的優勢 有了數據庫分頁查詢&#xff0c;為什么還需要搜索引擎&#xff1f; 搜索引擎速度上很快數據庫分頁查詢&#xff0c;隨著數據庫數據量增大&#xff0c;頁數靠后&#xff0c;會導致搜索速度變慢&#xff0c;但是搜索引擎不會搜索引擎支持分詞查詢&#xff0c;地…

安裝OpenJDK1.8 17 (macos M芯片)

安裝OpenJDK 1.8 下載完后&#xff0c;解壓&#xff0c;打開 環境變量的配置文件即可 vim ~/.zshrc #export JAVA_HOME/Users/xxxxx/jdk-21.jdk/Contents/Home #export JAVA_HOME/Users/xxxxx/jdk-17.jdk/Contents/Home #export JAVA_HOME/Users/xxxxx/jdk-11.jdk/Contents…

斷言與反射——以golang為例

斷言 x.(T) 檢查x的動態類型是否是T&#xff0c;其中x必須是接口值。 簡單使用 func main() {var x interface{}x 100value1, ok : x.(int)if ok {fmt.Println(value1)}value2, ok : x.(string)if ok {//未打印fmt.Println(value2)} }需要注意如果不接受第二個參數就是OK,這…

Java設計模式:系統性解析與核心模式

一、設計模式三大分類總覽 創建型模式&#xff08;5種&#xff09; 核心目標&#xff1a;對象創建的優化與解耦 單例模式&#xff08;Singleton&#xff09; 工廠模式&#xff08;Factory&#xff09; 抽象工廠模式&#xff08;Abstract Factory&#xff09; 建造者模式&#…

Elasticsearch 向量數據庫,原生支持 Google Cloud Vertex AI 平臺

作者&#xff1a;來自 Elastic Valerio Arvizzigno Elasticsearch 將作為第一個第三方原生語義對齊引擎&#xff0c;支持 Google Cloud 的 Vertex AI 平臺和 Google 的 Gemini 模型。這使得聯合用戶能夠基于企業數據構建完全可定制的生成式 AI 體驗&#xff0c;并借助 Elastics…

408 計算機網絡 知識點記憶(7)

前言 本文基于王道考研課程與湖科大計算機網絡課程教學內容&#xff0c;系統梳理核心知識記憶點和框架&#xff0c;既為個人復習沉淀思考&#xff0c;亦希望能與同行者互助共進。&#xff08;PS&#xff1a;后續將持續迭代優化細節&#xff09; 往期內容 408 計算機網絡 知識…

10-MySQL-性能優化思路

1、優化思路 當我們發現了一個慢SQL的問題的時候,需要做性能優化,一般我們是為了提高SQL查詢更快,一個查詢的流程由下圖的各環節組成,每個環節都會消耗時間,要減少消耗時候需要從各個環節都分析一遍。 2 連接配置優化 第一個環節是客戶端連接到服務端,這塊可能會出現服務…

Docker:安裝與部署 Nacos 的技術指南

1、簡述 Nacos(Dynamic Naming and Configuration Service)是阿里巴巴開源的一個動態服務發現、配置管理和服務治理的綜合解決方案,適用于微服務架構。 Nacos 主要功能: 服務發現與注冊:支持 Dubbo、Spring Cloud 等主流微服務框架的服務發現與注冊。動態配置管理:支持…

【非機動車檢測】用YOLOv8實現非機動車及駕駛人佩戴安全帽檢測

非機動車及駕駛人佩戴安全帽檢測任務的意義主要包括以下幾點&#xff1a; 保障行車安全&#xff1a;非機動車包括自行車、電動車等&#xff0c;佩戴安全帽能夠有效保護騎車人頭部&#xff0c;減少因交通事故造成的頭部傷害風險&#xff0c;提高行車安全系數。 符合交通法規&am…

壹起航:15年深耕互聯網營銷,助力中國工廠出海獲客

在全球化浪潮下&#xff0c;越來越多的中國工廠渴望拓展海外市場&#xff0c;但面臨品牌建立、穩定詢盤獲取及營銷成本降低等多重挑戰。壹起航憑借15年的豐富經驗&#xff0c;整合外貿建站、SEO優化及海外短視頻營銷&#xff0c;為中國工廠提供一站式出海解決方案。 一、外貿獨…

Emacs 折騰日記(二十)——修改emacs的一些默認行為

上一篇我們完成了emacs輸入法的配置以及將emacs配置成了使用vim的操作方式。但是emacs目前有些默認行為我不太喜歡&#xff0c;這節我們一起來修改它 備份設置 我們打開emacs的配置文件所在路徑&#xff0c;發現有大量的~結尾的文件&#xff0c;這是emacs的備份文件。這里&am…

聊透多線程編程-線程基礎-4.C# Thread 子線程執行完成后通知主線程執行特定動作

在多線程編程中&#xff0c;線程之間的同步和通信是一個常見的需求。例如&#xff0c;我們可能需要一個子線程完成某些任務后通知主線程&#xff0c;并由主線程執行特定的動作。本文將基于一個示例程序&#xff0c;詳細講解如何使用 AutoResetEvent 來實現這種場景。 示例代碼…

【網絡安全 | 項目開發】Web 安全響應頭掃描器(提升網站安全性)

原創項目,未經許可,不得轉載。 文章目錄 項目簡介工作流程示例輸出技術棧項目代碼使用說明項目簡介 安全響應頭是防止常見 Web 攻擊(如點擊劫持、跨站腳本攻擊等)的有效防線,因此合理的配置這些頭部信息對任何網站的安全至關重要。 Web 安全響應頭掃描器(Security Head…

使用libcurl編寫爬蟲程序指南

用戶想知道用Curl庫編寫的爬蟲程序是什么樣的。首先&#xff0c;我需要明確Curl本身是一個命令行工具和庫&#xff0c;用于傳輸數據&#xff0c;支持多種協議。而用戶提到的“Curl庫”可能指的是libcurl&#xff0c;這是一個客戶端URL傳輸庫&#xff0c;可以用在C、C等編程語言…