代碼隨想錄算法訓練營第五十一天| 115.不同的子序列、583. 兩個字符串的刪除操作、 72. 編輯距離

LeetCode 115.不同的子序列

題目鏈接:https://leetcode.cn/problems/distinct-subsequences/description/
文章鏈接:https://programmercarl.com/0115.%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97.html

思路

 * dp[i][j]:以i-1為結尾的s子序列中出現以j-1為結尾的t的個數為dp[i][j]。* 這一類問題,基本是要分析兩種情況* s[i - 1] 與 t[j - 1]相等* s[i - 1] 與 t[j - 1] 不相等* (1)當s[i - 1] 與 t[j - 1]相等時,dp[i][j]可以有兩部分組成。* 一部分是用s[i - 1]來匹配,那么個數為dp[i - 1][j - 1]。即不需要考慮當前s子串和t子串的最后一位字母,所以只需要 dp[i-1][j-1]。* 一部分是不用s[i - 1]來匹配,個數為dp[i - 1][j]。* 例如: s:bagg 和 t:bag ,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]來匹配,即用s[0]s[1]s[2]組成的bag。* 當然也可以用s[3]來匹配,即:s[0]s[1]s[3]組成的bag。* 所以當s[i - 1] 與 t[j - 1]相等時,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];* (2)當s[i - 1] 與 t[j - 1]不相等時,dp[i][j]只有一部分組成,不用s[i - 1]來匹配(就是模擬在s中刪除這個元素),即:dp[i - 1][j]* 所以遞推公式為:dp[i][j] = dp[i - 1][j];
    public int numDistinct(String s, String t) {int len1 = s.length();int len2 = t.length();int[][] dp = new int[len1 + 1][len2 + 1];for (int i = 0; i <= len1; i++) {dp[i][0] = 1;}for (int i = 1; i <= len1 ; i++) {char t1 = s.charAt(i);for (int j = 1; j <= len2 ; j++) {char t2 = t.charAt(j);if (t1 == t2)dp[i][j] = dp[i-1][j-1] + dp[i-1][j];elsedp[i][j] = dp[i-1][j];}}return dp[len1][len2];}

LeetCode 583. 兩個字符串的刪除操作

題目鏈接:https://leetcode.cn/problems/delete-operation-for-two-strings/description/
文章鏈接:https://programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

思路

 * dp[i][j]:以i-1為結尾的字符串word1,和以j-1位結尾的字符串word2,想要達到相等,所需要刪除元素的最少次數* 當word1[i - 1] 與 word2[j - 1]相同的時候* 當word1[i - 1] 與 word2[j - 1]不相同的時候* 當word1[i - 1] 與 word2[j - 1]相同的時候,dp[i][j] = dp[i - 1][j - 1];* 當word1[i - 1] 與 word2[j - 1]不相同的時候,有三種情況:* 情況一:刪word1[i - 1],最少操作次數為dp[i - 1][j] + 1* 情況二:刪word2[j - 1],最少操作次數為dp[i][j - 1] + 1* 情況三:同時刪word1[i - 1]和word2[j - 1],操作的最少次數為dp[i - 1][j - 1] + 2* 那最后當然是取最小值,所以當word1[i - 1] 與 word2[j - 1]不相同的時候,遞推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});* 因為 dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2,所以遞推公式可簡化為:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1)
    public int minDistance(String word1, String word2) {int len1 = word1.length();int len2 = word2.length();int[][] dp = new int[len1 + 1][len2 + 1];for (int i = 0; i <= len1; i++) {dp[i][0] = i;}for (int j = 0; j <= len2; j++) {dp[0][j] = j;}for (int i = 1; i <= len1; i++) {char t1 = word1.charAt(i);for (int j = 1; j <= len2; j++) {char t2 = word2.charAt(j);if (t1 == t2)dp[i][j] = dp[i - 1][j - 1];elsedp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);}}return dp[len1][len2];}

LeetCode 72. 編輯距離

題目鏈接:https://leetcode.cn/problems/edit-distance/description/
文章鏈接:https://programmercarl.com/0072.%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

思路

 * dp[i][j] 表示以下標i-1為結尾的字符串word1,和以下標j-1為結尾的字符串word2,最近編輯距離為dp[i][j]* (1)if (word1[i - 1] == word2[j - 1]) 那么說明不用任何編輯,dp[i][j] 就應該是 dp[i - 1][j - 1],即dp[i][j] = dp[i - 1][j - 1];* (2)if (word1[i - 1] != word2[j - 1]),此時就需要編輯了* 操作一:word1刪除一個元素,那么就是以下標i - 2為結尾的word1 與 j-1為結尾的word2的最近編輯距離 再加上一個操作。dp[i][j] = dp[i - 1][j] + 1;* 操作二:word2刪除一個元素,那么就是以下標i - 1為結尾的word1 與 j-2為結尾的word2的最近編輯距離 再加上一個操作。即 dp[i][j] = dp[i][j - 1] + 1;* 添加操作和刪除操作是一樣的,例如:word2添加一個元素,相當于word1刪除一個元素,例如 word1 = "ad" ,word2 = "a",word1刪除元素'd' 和 word2添加一個元素'd',變成word1="a", word2="ad", 最終的操作數是一樣!* 操作三:替換元素,word1替換word1[i - 1],使其與word2[j - 1]相同,此時不用增刪加元素。* 可以回顧一下,if (word1[i - 1] == word2[j - 1])的時候我們的操作 是 dp[i][j] = dp[i - 1][j - 1] 對吧。* 那么只需要一次替換的操作,就可以讓 word1[i - 1] 和 word2[j - 1] 相同。* 所以 dp[i][j] = dp[i - 1][j - 1] + 1;
public int minDistance(String word1, String word2) {int len1 = word1.length();int len2 = word2.length();int[][] dp = new int[len1 + 1][len2 + 1];for (int i = 1; i <= len1; i++) {dp[i][0] = i;}for (int j = 1; j <= len2; j++) {dp[0][j] = j;}for (int i = 1; i <= len1; i++) {char t1 = word1.charAt(i);for (int j = 1; j <= len2; j++) {char t2 = word2.charAt(j);if (t1 == t2)dp[i][j] = dp[i - 1][j - 1];elsedp[i][j] = Math.min(Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + 1);}}return dp[len1][len2];}

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

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

相關文章

Docker快速極簡配置nginx實現不同域名訪問分流

文章目錄 前言安裝配置使用鏡像拉取及環境配置修改代理文件編寫docker-compose文件啟動nginx代理 總結 前言 本文主要記錄如何使用docker安裝配置Nginx&#xff0c;如何使用Nginx把通過80、443端口訪問的請求根據域名分發到不同端口。那么什么是Nginx呢&#xff0c;下邊做個簡…

將產品制作成3D模型在網站上展示需要多少費用?

將產品制作成3D模型并在網站上展示的費用會因多種因素而異&#xff0c;包括模型的復雜度、所需的細節程度、制作3D模型的軟件和工具、以及是否需要專業設計師的服務等。此外&#xff0c;不同的3D模型制作服務提供商可能會有不同的定價標準。 如果能自己制作3D模型&#xff0c;…

友力科技IDC機房搬遷方案流程分享

機房搬遷流程 系統搬遷實施流程包括&#xff1a;準備、拆卸、裝運、安裝、調試等五個流程&#xff0c;具體如下&#xff1a; 準備:包括相關人員和設備準備、新機房環境準備、網絡環境、備份、現場所有設備打標簽、模塊、設備準備等準備工作。拆卸&#xff1a;主要只核心設備下…

iptables(2)安裝及規則查詢

安裝iptables 我是用的系統是debian 12,目前沒有安裝iptables。 防火墻已經安裝完成了 iptables 的配置語法 iptables (選項) (參數) # 通用匹配:源地址目標地址的匹配 -p:指定要匹配的數據包協議類型 -s, --source [!] address[/mask] :把指定的一個/一組地址作為源地…

防坑知識:如果要查自己的大數據信用報告,這幾種平臺一定不要選!

很多小伙伴在候遇到申貸碰壁&#xff0c;特別是被告知原因是大數據不良之后&#xff0c;都急著去了解自己的大數據信用情況&#xff0c;常見的方式就是在百度搜索大數據信用&#xff0c;大數據報告查詢&#xff0c;哪里能查大數據信用等關鍵詞&#xff0c;隨便找一個地方就去查…

Python 中處理大量用戶閱讀歷史數據的策略

Python 中處理大量用戶閱讀歷史數據的策略 處理大量數據時&#xff0c;效率和性能成為關鍵考慮因素。Python 提供了一系列工具和技術&#xff0c;可以幫助我們高效地處理大數據集。以下是一些處理大量用戶閱讀歷史數據的策略。 1. 使用合適的數據存儲解決方案 對于大規模數據…

【深度C++】之“目錄”

0. 關于【深度C】 2023年5月&#xff0c;看了一個月《C Primer&#xff08;第5版&#xff09;》的我&#xff0c;感覺很“頭疼”。 雖然看了很多&#xff0c;但是并沒有組織在一起。仿佛一個有很多線頭的毛線團&#xff0c;無從整理。 比如一口氣讓你說出const的用法&#x…

不常見的邏輯漏洞

文章目錄 1. 邏輯漏洞2. 理賠類邏輯漏洞3. 支付類漏洞3.1 超時未發貨商品賠付漏洞3.2 騙取某寶運費險漏洞 4. 批量注冊場景5. 享受特權用戶功能6. 社交類型場景7. 購物類型場景8. 簽約漏洞場景 1. 邏輯漏洞 邏輯漏洞不可以用掃描器去掃&#xff0c;漏洞&#xff0c;就是由于開發…

MVCC多版本并發控制機制、事務的隔離級別

目錄 一、MVCC多版本并發控制機制 二、事務的隔離級別 一、MVCC多版本并發控制機制 1、定義&#xff1a; MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并發控制&#xff09;一種并發控制機制&#xff0c;在數據庫中用來控制并發執行的事務&#xf…

好消息!終于解決了!Coze工作流錯誤中斷問題終于得到解決!

文章目錄 ?? 介紹 ???? 演示環境 ???? 解決方案 ???? 常見的工作流中斷問題?? 好消息來了!?? 相關鏈接 ???? 介紹 ?? 大家是否曾經遇到過這樣的問題:在Coze平臺辛辛苦苦設計的一個工作流,尤其是流程非常復雜和長的情況下,只要中間一個環節出錯,整…

ansible常用模塊詳解

一、Ansible 1.1 簡介 Ansible是自動化運維工具&#xff0c;能實現跨主機對應用編排管理部署。 Ansible能批量配置、部署、管理上千臺主機&#xff0c;是應用級別的跨主機編排工具。 比如以前需要切換到每個主機上執行的一或多個操作&#xff0c;使用Ansible只需在固定的一…

程序員必會英文語句 – 前后端交流篇

很多程序員日常用不到說英語的場景&#xff0c;或者遇到不會的英文單詞直接一查就可以了。但也有很多程序員面試的時候要求來一場英文的表述&#xff0c;最近的工作呢&#xff0c;需要和外國人的后端開發交流&#xff0c;所以我整理了一下我日常用到的英文語句&#xff0c;也許…

Mybatis-Plus的筆記

Mybatis-Plus其實是Mybatis的升級版&#xff0c;他簡化了原先mybatis需要手動寫CURD語句轉而繼承BaseMapper來實現。具體變化如下&#xff1a; 1&#xff0c;MyBatis-Plus簡介&#xff1a;MP&#xff0c;是mybatis的增強工具&#xff0c;是基于mybatis上開發的。 特點&#xf…

智駕未來,一觸即達——探索全新加油App的無限可能

一、引言 隨著科技的飛速發展&#xff0c;智能出行已成為現代生活的重要組成部分。為了滿足廣大駕駛者的需求&#xff0c;我們傾力打造了一款全新的加油App&#xff0c;旨在為您的駕駛旅程提供前所未有的便捷與智能體驗。 二、產品概述 我們的加油App不僅是一款導航工具&…

windows如何看是否支持多核并行

在Windows中查看是否支持多核并行處理&#xff0c;可以通過以下幾種方法&#xff1a; 使用任務管理器&#xff1a; 右鍵點擊任務欄空白處選擇“任務管理器”。 切換到“性能”標簽頁。 查看“處理器”一欄&#xff0c;如果看到多個處理器核心&#xff0c;并且每個核心旁邊顯…

每日一道算法題 有效括號序列

題目 有效括號序列_牛客題霸_牛客網 (nowcoder.com) Python 1長度必須為偶數 2就像開心消消樂一樣&#xff0c;一左一右就消掉。 class Solution:def isValid(self , s: str) -> bool:# write code here# flag[(),{},[]]# for _ in range(len(s)//2):# for i in fl…

以HMO模式為核心,平安健康穩健前行

自2014年成立以來&#xff0c;平安健康始終聚焦解決“看病難、看病貴、看病遠”的痛點&#xff0c;通過科技手段優化醫療服務流程&#xff0c;降低用戶就醫成本。經過數年的耕耘&#xff0c;平安健康已成功轉型為一站式健康管理平臺&#xff0c;打通了醫療、藥品、康復等多個環…

力扣每日一題 6/27 字符串 貪心

博客主頁&#xff1a;誓則盟約系列專欄&#xff1a;IT競賽 專欄關注博主&#xff0c;后期持續更新系列文章如果有錯誤感謝請大家批評指出&#xff0c;及時修改感謝大家點贊&#x1f44d;收藏?評論? 2734.執行子串操作后的字典序最小字符串【中等】 題目&#xff1a; 給你一…

Java中的異常處理:Checked與Unchecked的區別

Java中的異常處理&#xff1a;Checked與Unchecked的區別 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 異常處理概述 在Java編程中&#xff0c;異常處理是一…

MySQL定位CPU利用率過高的SQL方法

前言 當mysql CPU告警利用率過高的時候&#xff0c;我們應該怎么定位是哪些SQL導致的呢&#xff0c;本文將介紹一下定位的方法。 本文所使用的方法&#xff0c;前提是你可以登錄到Mysql所在的服務器&#xff0c;執行命令查看進程&#xff0c;當然讓數據庫管理員登錄執行也可以…