【LeetCode-1143】最長公共子序列(動歸)

目錄

題目描述

解法1:動態規劃

代碼實現


題目鏈接

題目描述

給定兩個字符串 text1 和 text2,返回這兩個字符串的最長公共子序列的長度。

一個字符串的 子序列 是指這樣一個新的字符串:它是由原字符串在不改變字符的相對順序的情況下刪除某些字符(也可以不刪除任何字符)后組成的新字符串。

例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。兩個字符串的「公共子序列」是這兩個字符串所共同擁有的子序列。

若這兩個字符串沒有公共子序列,則返回 0。

示例 1:

  • 輸入:text1 = "abcde", text2 = "ace"

  • 輸出:3

  • 解釋:最長公共子序列是 "ace",它的長度為 3。

示例 2:

  • 輸入:text1 = "abc", text2 = "abc"

  • 輸出:3

  • 解釋:最長公共子序列是 "abc",它的長度為 3。

示例 3:

  • 輸入:text1 = "abc", text2 = "def"

  • 輸出:0

  • 解釋:兩個字符串沒有公共子序列,返回 0。

提示:

  • 1 <= text1.length <= 1000

  • 1 <= text2.length <= 1000 輸入的字符串只含有小寫英文字符。

解法1:動態規劃

本題和動態規劃:718. 最長重復子數組區別在于這里不要求是連續的了,但要有相對順序,即:"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。

繼續動規分析如下:

  1. 確定dp數組(dp table)以及下標的含義

dpi:長度為[0, i - 1]的字符串text1與長度為[0, j - 1]的字符串text2的最長公共子序列為dpi

  1. 確定遞推公式

主要就是兩大情況: text1[i - 1] 與 text2[j - 1]相同,text1[i - 1] 與 text2[j - 1]不相同如果text1[i - 1] 與 text2[j - 1]相同,那么找到了一個公共元素,所以dpi = dpi - 1 + 1;如果text1[i - 1] 與 text2[j - 1]不相同,那就看看text1[0, i - 2]與text2[0, j - 1]的最長公共子序列 和 text1[0, i - 1]與text2[0, j - 2]的最長公共子序列,取最大的。即:dpi = max(dpi - 1, dpi);

代碼如下:

if (text1[i - 1] == text2[j - 1]) {dp[i][j] = dp[i - 1][j - 1] + 1;
} else {dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
  1. dp數組如何初始化

先看看dpi應該是多少呢?test1[0, i-1]和空串的最長公共子序列自然是0,所以dpi = 0;

同理dp0也是0。其他下標都是隨著遞推公式逐步覆蓋,初始為多少都可以,那么就統一初始為0。

代碼:

vector<vector<int>> dp(text1.size() + 1, vector<int>(text2.size() + 1, 0));
  1. 確定遍歷順序

從遞推公式,可以看出,有三個方向可以推出dpi,如圖:

那么為了在遞推的過程中,這三個方向都是經過計算的數值,所以要從前向后,從上到下來遍歷這個矩陣。

代碼實現
class Solution {public int longestCommonSubsequence(String text1, String text2) {int len1 = text1.length();int len2 = text2.length();
?int[] dp = new int[len2+1];
?for (int i = 0; i < len1; i++) {int pre = dp[0];for (int j = 1; j <= len2; j++) {int cur = dp[j];if (text1.charAt(i) == text2.charAt(j-1)) {dp[j] = pre + 1;} else {dp[j] = Math.max(dp[j-1], dp[j]);}pre = cur;}}
?return dp[len2];
?}
}

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

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

相關文章

Linux系統這些壓測工具,你用過嗎?

作為一名運維人員,你是否遇到過這種場景?需要用工具測試系統cpu或內存占用高來觸發告警,或者通過壓測測試服務的并發能力。作為運維工程師,也可以通過這些命令復現故障場景。那么通過本文可以讓你掌握常用的測試命令和工具。 更多技術博客,請關注微信公眾號:運維之美 一、…

LIDAR2Camera 手動標定

參考&#xff1a;搞懂了&#xff01;原來激光雷達和相機的內外參是這樣標定的_嗶哩嗶哩_bilibili 代碼下載&#xff1a;SensorsCalibration/lidar2camera at master PJLab-ADG/SensorsCalibration (github.com)

社區店選址評估:利用大數據選址的技巧與策略

在當今數字化的時代&#xff0c;利用大數據進行社區店選址評估已成為一種高效、科學的方法。作為一名開鮮奶吧5年的創業者&#xff0c;我將分享一些利用大數據選址的技巧與策略&#xff0c;幫助你找到最適合的店鋪位置。 1、確定目標商圈 在選址之前&#xff0c;首先要明確自己…

涉及主頁面內嵌iframe中的列表數據的保存

場景&#xff1a;主表 : 附表 1 : m&#xff0c;同一個頁面&#xff0c;共同使用一個保存按鈕進行兩個表的數據保存&#xff0c;頁面中間有個查詢按鈕&#xff0c;可以對子iframe頁面的內容進行刷新 流程項目頁面內嵌了個子iframe&#xff0c;項目頁面表單數據提交保存是一個…

爬蟲的一些小技巧總結

一、在爬蟲中&#xff0c;爬取的數據類型如下 1.document:返回的是一個HTML文檔 2.png:無損的圖片&#xff0c;jpg:壓縮后的圖片,wbep:有損壓縮&#xff0c;比png差&#xff0c;比jpg好 3.avgxml圖像編碼字符串 4.script:腳本文件&#xff0c;依據一定格式編寫的可執行的文…

【大廠AI課學習筆記NO.58】(11)混淆矩陣

混淆矩陣&#xff08;confusion matrix&#xff09;—— 混淆矩陣&#xff08;Confusion Matrix&#xff09;是人工智能領域&#xff0c;特別是在機器學習和深度學習中&#xff0c;用于衡量分類模型性能的重要工具。它通過統計分類模型的真實分類與預測分類之間的結果&#xf…

【python debug】python常見編譯問題解決方法_2

序言 記錄python使用過程中碰到的一些問題及其解決方法上一篇&#xff1a;python常見編譯問題解決方法_1 1. PermissionError: [Errno 13] Permission denied: ‘/lostfound’ 修改前&#xff1a; 修改后&#xff08;解決&#xff09;&#xff1a; 此外&#xff0c;可能文件夾…

leetcode 熱題 100_接雨水

題解一&#xff1a; 按列求&#xff1a;分別考慮每一列的雨水高度&#xff0c;某列的雨水高度只與其左側最高墻和右側最高墻有關&#xff0c;一種情況是該列比左右側的墻都低&#xff0c;則根據木桶效應該列雨水高度為min(左側墻高&#xff0c;右側墻高)-列高&#xff0c;而其余…

智能駕駛及相關零部件攝像頭毫米波雷達激光雷達和芯片滲透率

一、總體情況 乘聯會數據顯示&#xff0c;1月1日至1月28日&#xff0c;全國乘用車廠商新能源車批發銷量為56.7萬輛&#xff0c;同比增長76%&#xff0c;環比下降38%&#xff1b;國內新能源車市場零售銷量為59.6萬輛&#xff0c;同比增長92%&#xff0c;環比下降24%。 二、銷…

考研總計劃(基礎篇)

分為數學&#xff0c;專業課&#xff0c;英語三個部分 數學規劃表 高數基礎&#xff1a;3月初到4月15號 具體實行計劃&#xff1a;分為看課日和寫題日 看課日:早上10點到12點半看課&#xff0c;19:30到21:30繼續看課。 寫題日:早上10點到12點半復習前一天的題目&#xff0…

【word】引用文獻如何標注右上角

一、在Word文檔中引用文獻并標注在右上角的具體步驟如下 1、將光標移動到需要添加文獻標注的位置&#xff1a; 2、在文檔上方的工具欄中選擇“引用”選項&#xff1a; 3、點擊“插入腳注”或“插入尾注”&#xff1a; ①如果選擇的是腳注&#xff0c;則腳注區域會出現在本頁的…

多路轉接之epoll

常用的三個API&#xff1a; epoll_create(); //例如 int epfd epoll(10);創建一棵有10個結點的紅黑樹&#xff0c;注意&#xff1a;這個數只是對內核建議的數值&#xff0c;內核參照這個參數去構建epoll_ctrl();//參數2 op可以取值 EPOLL_CTL_ADD/MOD/DELevents:EPOLLIN/…

Professor教誨-學術筆記1

關于指導學生 自己帶的學生&#xff0c;要把文章從頭到尾檢查好了&#xff0c;再發給professor要至少留給professor一周的時間改文章&#xff0c;太遲了不如放棄DDL要在合作中&#xff0c;充分尊重合作者認真對待向別人求推薦信這件事&#xff0c;別人找你推薦也要慎重&#x…

成為大佬之路--linux軟件安裝使用第000000025篇--linux docker安裝mysql

安裝 1.拉取鏡像 docker pull centos/mysql-57-centos7 2.啟動mysql docker run -di --nametensquare_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 centos/mysql-57-centos7

Pyglet圖形界面版2048游戲——詳盡實現教程(上)

目錄 Pyglet圖形界面版2048游戲 一、色塊展示 二、繪制標題 三、方陣色塊 四、界面布局 五、鍵鼠操作 Pyglet圖形界面版2048游戲 一、色塊展示 準備好游戲數字的背景顏色&#xff0c;如以下12種&#xff1a; COLOR ((206, 194, 180, 255), (237, 229, 218, 255), (23…

常見Vue原理面試題

1. Vue的響應式原理是什么&#xff1f;請詳細說明Object.defineProperty()和Proxy的區別和用法。 響應式原理&#xff1a;Vue中采用了數據劫持的方式&#xff0c;通過Object.defineProperty()函數來監聽數據變化&#xff0c;并在數據變化時觸發對應的更新函數。 Object.define…

SpringCloud負載均衡源碼解析 | 帶你從表層一步步剖析Ribbon組件如何實現負載均衡功能

目錄 1、負載均衡原理 2、源碼分析 2.1、LoadBalanced 2.2、LoadBalancerClient 2.3、RibbonAutoConfiguration 2.4、LoadBalancerAutoConfiguration 2.5、LoadBalancerIntercepor? 2.6、再回LoadBalancerClient 2.7、RibbonLoadBalancerClient 2.7.1、DynamicServe…

OpenCV 4基礎篇| OpenCV圖像的拼接

目錄 1. Numpy (np.hstack&#xff0c;np.vstack)1.1 注意事項1.2 代碼示例 2. matplotlib2.1 注意事項2.2 代碼示例 3. 擴展示例&#xff1a;多張小圖合并成一張大圖4. 總結 1. Numpy (np.hstack&#xff0c;np.vstack) 語法結構&#xff1a; retval np.hstack(tup) # 水平…

工作日記:JavaScript fill() 方法

定義 fill() 方法用于將一個固定值替換數組的元素。 語法 array.fill(value, start, end) value&#xff1a;必填。要填充的值 start&#xff1a;可選。開始填充位置 end&#xff1a;可選。結束填充位置&#xff08;默認是數組的長度&#xff1a;array.length&#xff09;…

提取拼多多店鋪商家電話的爬蟲軟件

拼多多是中國知名的團購電商平臺&#xff0c;許多用戶在購物時都希望能夠直接聯系到店鋪商家&#xff0c;以便獲得更多的產品信息或解決問題。在這篇文章中&#xff0c;我們將介紹如何使用Python編寫一個爬蟲軟件&#xff0c;來提取拼多多店鋪商家電話。 首先&#xff0c;我們…