【區間動態規劃】1771. 由子序列構造的最長回文串的長度

本文涉及知識點

動態規劃匯總

LeetCode1771. 由子序列構造的最長回文串的長度

給你兩個字符串 word1 和 word2 ,請你按下述方法構造一個字符串:
從 word1 中選出某個 非空 子序列 subsequence1 。
從 word2 中選出某個 非空 子序列 subsequence2 。
連接兩個子序列 subsequence1 + subsequence2 ,得到字符串。
返回可按上述方法構造的最長 回文串 的 長度 。如果無法構造回文串,返回 0 。
字符串 s 的一個 子序列 是通過從 s 中刪除一些(也可能不刪除)字符而不更改其余字符的順序生成的字符串。
回文串 是正著讀和反著讀結果一致的字符串。
示例 1:
輸入:word1 = “cacb”, word2 = “cbba”
輸出:5
解釋:從 word1 中選出 “ab” ,從 word2 中選出 “cba” ,得到回文串 “abcba” 。
示例 2:
輸入:word1 = “ab”, word2 = “ab”
輸出:3
解釋:從 word1 中選出 “ab” ,從 word2 中選出 “a” ,得到回文串 “aba” 。
示例 3:
輸入:word1 = “aa”, word2 = “bb”
輸出:0
解釋:無法按題面所述方法構造回文串,所以返回 0 。
提示:
1 <= word1.length, word2.length <= 1000
word1 和 word2 由小寫英文字母組成

動態規劃

word3 = word1 + word2
n1 = word1.length
n2 = word2.length
n = word3.length

動態規劃的狀態表示

dp[i][j] 表示 words[i…j-1]的最長回文子序列。
空間復雜度: O(nn)

動態規劃的轉移方程

dp[i][j] = max(dp[i+1][j],dp[i][j-1]
如果words[i] 等于words[j], dp[i][j] = MaxSelf( dp[i+1][j-1])+2)
單個狀態轉移的時間復雜度:O(1)
故總的時間復雜度為:O(nn)
d p [ i ] [ j ] = { d p [ i ] [ j ? 1 ] d p [ j ? 1 ] 不在回文串中 d p [ i + 1 ] [ j ? 1 ] s [ i ] 和 s [ j ? 1 ] 對應 d p [ i + 1 ] [ j ] s [ j ? 1 ] 和其它字符對應 dp[i][j] =\begin{cases} dp[i][j-1] && dp[j-1]不在回文串中 \\ dp[i+1][j-1] && s[i]和s[j-1]對應\\ dp[i+1][j] && s[j-1]和其它字符對應 \\ \end{cases} dp[i][j]=? ? ??dp[i][j?1]dp[i+1][j?1]dp[i+1][j]??dp[j?1]不在回文串中s[i]s[j?1]對應s[j?1]和其它字符對應?

動態規劃的初值值

長度為1的子串 dp[i][j]全部為1,長度為0的子串,dp[i][j]全部為0。

動態規劃的填表順序

len 從2到N

動態規劃的返回值

( i < n1 )&& ( j >= n1) 最大值 (2+dp[i+1][j])
回文串的首字符必須在word1,尾字符必須在word2。

代碼

核心代碼

template<class ELE>
void MaxSelf(ELE* seft, const ELE& other)
{*seft = max(*seft, other);
}class Solution {
public:int longestPalindrome(string word1, string word2) {string s = word1 + word2;const auto N1 = word1.length();const int N = s.length();vector<vector<int>> dp(N, vector<int>(N+1, 0));for (int i = 0; i < N; i++) {dp[i][i+1] = 1;}for (int len = 2; len <= N; len++) {for (int left = 0; left + len <= N; left++) {dp[left][left + len] = max(dp[left+1][left + len], dp[left][left + len-1]);if (s[left] == s[left + len - 1]) {MaxSelf(&dp[left][left + len], dp[left + 1][left + len - 1] + 2);}}}int iRet = 0;for (int i = 0; i < N1; i++) {for (int j = N1; j < N; j++) {if( s[i] == s[j]){ MaxSelf(&iRet, dp[i + 1][j] + 2); }				}}return iRet;}
};

單元測試用例

template<class T1, class T2>
void AssertEx(const T1& t1, const T2& t2)
{Assert::AreEqual(t1, t2);
}template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{Assert::AreEqual(v1.size(), v2.size());for (int i = 0; i < v1.size(); i++){Assert::AreEqual(v1[i], v2[i]);}
}template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{sort(vv1.begin(), vv1.end());sort(vv2.begin(), vv2.end());Assert::AreEqual(vv1.size(), vv2.size());for (int i = 0; i < vv1.size(); i++){AssertEx(vv1[i], vv2[i]);}
}namespace UnitTest
{string word1,  word2;TEST_CLASS(UnitTest){public:TEST_METHOD(TestMethod0){word1 = "cacb", word2 = "cbba";auto res = Solution().longestPalindrome(word1, word2);AssertEx(5, res);}TEST_METHOD(TestMethod1){word1 = "ab", word2 = "ab";auto res = Solution().longestPalindrome(word1, word2);AssertEx(3, res);}TEST_METHOD(TestMethod2){word1 = "aa", word2 = "bb";auto res = Solution().longestPalindrome(word1, word2);AssertEx(0, res);}TEST_METHOD(TestMethod3){word1 = "a", word2 = "a";auto res = Solution().longestPalindrome(word1, word2);AssertEx(2, res);}TEST_METHOD(TestMethod4){word1 = "rhuzwqohquamvsz", word2 = "kvunbxje";auto res = Solution().longestPalindrome(word1, word2);AssertEx(7, res);}TEST_METHOD(TestMethod5){word1 = "wqo", word2 = "hquamvs";auto res = Solution().longestPalindrome(word1, word2);AssertEx(3, res);}TEST_METHOD(TestMethod6){word1 = "wqo", word2 = "hq";auto res = Solution().longestPalindrome(word1, word2);AssertEx(3, res);}TEST_METHOD(TestMethod7){word1 = "qo", word2 = "hq";auto res = Solution().longestPalindrome(word1, word2);AssertEx(3, res);}TEST_METHOD(TestMethod8){word1 = "qo", word2 = "q";auto res = Solution().longestPalindrome(word1, word2);AssertEx(3, res);}};
}

擴展閱讀

視頻課程

先學簡單的課程,請移步CSDN學院,聽白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成戰斗了,為老板分憂,請學習C#入職培訓、C++入職培訓等課程
https://edu.csdn.net/lecturer/6176

相關推薦

我想對大家說的話
《喜缺全書算法冊》以原理、正確性證明、總結為主。
按類別查閱鄙人的算法文章,請點擊《算法與數據匯總》。
有效學習:明確的目標 及時的反饋 拉伸區(難度合適) 專注
聞缺陷則喜(喜缺)是一個美好的愿望,早發現問題,早修改問題,給老板節約錢。
子墨子言之:事無終始,無務多業。也就是我們常說的專業的人做專業的事。
如果程序是一條龍,那算法就是他的是睛

測試環境

操作系統:win7 開發環境: VS2019 C++17
或者 操作系統:win10 開發環境: VS2022 C++17
如無特殊說明,本算法用**C++**實現。

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

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

相關文章

企業AI落地的大法器-用數據清洗手段提升數據質量,找回遺珠之光

開篇 書接上文&#xff0c;在上文《談LORA微調與數據質量處理之爭》中我們詳細敘述了&#xff1a;LORA微調手段和數據清洗之分&#xff0c;以及如何平衡和組合使用LORA微調與數據清洗的手法。 文末我們提到了“下一篇我們講著重講述&#xff1a;在打造企業數據清洗工具、平臺…

003 SpringBoot操作ElasticSearch7.x

文章目錄 5.SpringBoot集成ElasticSearch7.x1.添加依賴2.yml配置3.創建文檔對象4.繼承ElasticsearchRepository5.注入ElasticsearchRestTemplate 6.SpringBoot操作ElasticSearch1.ElasticsearchRestTemplate索引操作2.ElasticsearchRepository文檔操作3.ElasticsearchRestTempl…

git tag 打標簽指南

參考 Pro Git 打標簽 查看標簽 git tag git tag -l 創建標簽 git tag tag002 創建了名稱是 tag002 的標簽&#xff0c;打在最新提交的 commit 上。只是打在本地&#xff0c;沒有推送到遠程。 如果要給以前的 commitId 打標簽&#xff0c;就用 git tag tag001 159e40 給 159e4…

java基于ssm+jsp 彈幕視頻網站

1前臺首頁功能模塊 彈幕視頻網站&#xff0c;在彈幕視頻網站可以查看首頁、視頻信息、商品信息、論壇信息、我的、跳轉到后臺、購物車、客服等內容&#xff0c;如圖1所示。 圖1前臺首頁界面圖 登錄&#xff0c;通過登錄填寫賬號、密碼等信息進行登錄操作&#xff0c;如圖2所示…

GPT-5即將登場:期待AI新時代的技術突破與人機高效協作

隨著科技的飛速發展&#xff0c;我們即將迎來一個人工智能領域的重要里程碑——GPT-5的發布。這一技術革新無疑是一個激動人心的時刻&#xff0c;它預示著AI技術將邁向一個全新的高度。GPT-5作為人工智能領域的一大突破&#xff0c;有望為我們帶來前所未有的應用場景與深遠影響…

顯卡GTX與RTX有什么區別?哪一個更適合玩游戲?

游戲發燒友們可能對游戲顯卡并不陌生&#xff0c;它直接關系到游戲畫面的流暢度、細膩程度和真實感。在眾多顯卡品牌中&#xff0c;英偉達的GTX和RTX系列顯卡因其出色的性能而備受關注。 一、GTX與RTX的區別 架構差異 GTX系列顯卡采用的是Pascal架構&#xff0c;這是英偉達在…

探索MySQL核心技術:理解索引和主鍵的關系

在數據密集型應用中&#xff0c;數據庫的性能往往是決定一個應用成敗的重要因素之一。其中&#xff0c;MySQL作為一種開源關系型數據庫管理系統&#xff0c;以其卓越的性能和豐富的功能被廣泛應用。而在MySQL數據庫優化的眾多技巧中&#xff0c;索引和主鍵扮演著極其重要的角色…

安霸CVFlow推理開發筆記

一、安霸環境搭建&#xff1a; 1.遠程172.20.62.13 2. 打開Virtualbox&#xff0c;所在目錄&#xff1a;E:\Program Files\Oracle\VirtualBox 3. 配置好ubuntu18.04環境&#xff0c;Ubuntu密碼&#xff1a;amba 4. 安裝toolchain&#xff0c;解壓Ambarella_Toolchain_CNNGe…

鴻蒙開發HarmonyOS NEXT (二) 熟悉ArkUI

一、構造函數 構造一個商品類Item&#xff0c;然后利用foreach函數循環渲染 class Item {name: stringimage: ResourceStrprice: numberdiscount: numberconstructor(name: string, image: ResourceStr, price: number, discount: number 0) {this.name name;this.image ima…

JAVA進階學習09

文章目錄 一、雙列集合Map1.1 雙列集合介紹1.2 雙列集合Map常見API1.3 Map集合遍歷方式1.3.1 通過集合的全部鍵來遍歷集合1.3.2 Map集合遍歷方式21.3.3 Map集合遍歷方式3 二、Map集合的實現類2.1 HashMap類2.2 LinkedHashMap2.3 TreeMap 三、可變參數四、Collections類五、集合…

Vue 2.0 與 3.0區別

Vue.js是一種流行的前端JavaScript框架&#xff0c;用于構建用戶界面和單頁面應用程序。隨著時間的推移&#xff0c;Vue.js已經從Vue2發展到了Vue3&#xff0c;這兩個版本在**生命周期、模板組件以及性能**等方面有顯著差異。具體分析如下&#xff1a; 1. **生命周期** - **Vue…

恭喜朱雀橋的越南薇妮她牌NFC山竹汁飲料,成為霸王茶姬奶茶主材

朱雀橋NFC山竹汁飲料&#xff1a;榮登霸王茶姬奶茶主材&#xff0c;非遺傳承的天然之選 近日&#xff0c;據小編了解到&#xff1a;霸王茶姬欣喜地宣布&#xff0c;成功與朱雀橋達成合作越南薇妮她VINUT牌NFC山竹汁飲料。這款商超產品憑借其卓越的品質與獨特的口感&#xff0c…

PostgreSQL安裝教程及文件介紹

Ubuntu 安裝和配置 PostgreSQL 以 Ubuntu Server 20.04&#xff0c;PostgreSQL 12 版本為例。 1. 安裝 使用如下命令&#xff0c;安裝指定版本的 PostgreSQL sudo apt install postgresql-12在 Ubuntu 20.04 中安裝 PostgreSQL 登錄您的 Ubuntu 系統并使用以下 apt 命令更新…

Java web應用性能分析之【prometheus監控指標體系】

Java web應用性能分析之【系統監控工具prometheus】_javaweb服務器性能監控工具-CSDN博客 Java web應用性能分析之【prometheusGrafana監控springboot服務和服務器監控】_grafana 導入 prometheus-CSDN博客 因為篇幅原因&#xff0c;前面沒有詳細說明Prometheus的監控指標&…

將手機上的已安裝應用拷貝出到電腦中

方法一&#xff1a;通過應用管理器 下載并安裝應用管理器&#xff1a;可以使用應用管理器如“ES文件瀏覽器”或“APK Extractor”。 提取APK文件&#xff1a; 打開應用管理器。 找到已安裝的應用程序列表。 選擇你想要提取的應用程序&#xff0c;然后選擇“提取”或“備份”選…

數據結構 —— 哈夫曼樹

數據結構 —— 哈夫曼樹 哈夫曼樹定義構造算法特性應用 哈夫曼編碼核心概念工作原理特點 我們今天來看哈夫曼樹&#xff1a; 哈夫曼樹 哈夫曼樹&#xff08;Huffman Tree&#xff09;&#xff0c;是一種特殊的二叉樹&#xff0c;由D.A. Huffman在1952年提出&#xff0c;主要用…

[面試題]計算機網絡

[面試題]Java【基礎】[面試題]Java【虛擬機】[面試題]Java【并發】[面試題]Java【集合】[面試題]MySQL[面試題]Maven[面試題]Spring Boot[面試題]Spring Cloud[面試題]Spring MVC[面試題]Spring[面試題]MyBatis[面試題]Nginx[面試題]緩存[面試題]Redis[面試題]消息隊列[面試題]…

ES報錯:解決too_many_clauses: maxClauseCount is set to 1024 報錯問題

解決too_many_clauses: maxClauseCount is set to 1024 報錯問題 問題場景報錯信息問題分析解決1. 優化查詢2. 增加maxClauseCount3. 改用其他查詢類型修改后的查詢示例 問題場景 查詢語句&#xff1a;查詢clcNo分類號包含分類O的所有文檔 {"match_phrase_prefix":…

社會與網絡的討論#1

“拒絕心靈雞湯” 都說人人平等&#xff0c;那請問一個有錢人看到一個掃大街的&#xff0c;能有幾個保證不產生厭惡感的&#xff1f; 你能確保&#xff0c;你的工資會比有關系的人的工資高嗎&#xff1f; 你進入公司&#xff0c;有有關系的人進入的方便嗎&#xff1f; 在學…

特產零售元宇宙:探索虛擬世界的商業機遇

在數字化時代&#xff0c;元宇宙作為一個全新的虛擬世界&#xff0c;正在逐漸改變我們的生活方式和商業模式。隨著技術的不斷發展&#xff0c;特產零售業也開始嘗試進入這個充滿無限可能的新領域。本文將探討特產零售元宇宙的概念、優勢以及面臨的挑戰&#xff0c;并分析其未來…