【動態規劃】回文串(二)

📝前言說明:

  • 本專欄主要記錄本人的動態規劃算法學習以及LeetCode刷題記錄,按專題劃分
  • 每題主要記錄:(1)本人解法 + 本人屎山代碼;(2)優質解法 + 優質代碼;(3)精益求精,更好的解法和獨特的思想(如果有的話)
  • 文章中的理解僅為個人理解。如有錯誤,感謝糾錯

🎬個人簡介:努力學習ing
📋本專欄:C++刷題專欄
📋其他專欄:C語言入門基礎,python入門基礎,C++學習筆記,Linux
🎀CSDN主頁 愚潤澤

你可以點擊下方鏈接,進行不同專題的動態規劃的學習

點擊鏈接開始學習
斐波那契數列模型路徑問題
簡單多狀態(一)簡單多狀態(二)
子數組系列(一)子數組系列(二)
子序列問題(一)子序列問題(二)
回文串(一)回文串(二)
兩個數組dp問題(一)兩個數組的dp問題(二)
01背包問題完全背包
二維的背包問題其他

題單匯總鏈接:點擊 → 題單匯總

題目

  • 132. 分割回文串 II
    • 優質解
  • 516. 最長回文子序列
    • 優質解
  • 1312. 讓字符串成為回文串的最少插入次數
    • 優質解


132. 分割回文串 II

題目鏈接:https://leetcode.cn/problems/palindrome-partitioning-ii/description/
在這里插入圖片描述


優質解

思路:

  • 對表示是否是回文子串的 isPal 數組再做一次 dp
  • dp[i]: s[0 - i] 中要分割的最少次數
  • 我們可以把串分成:[0 - j-1][j - i],而 dp[j - 1] 可以表示以 j - 1 結尾的子串分割的最小次數(已知)
  • 所以 j 遍歷:1 <= j <= i,
    • 如果 [j - i] 可以構成回文串: dp[i] = dp[j - 1] + 1,
    • 不能構成: 跳過(遲早到 i == j 的時候會構成回文)
    • 取循環中得到的 dp[i] 的最小值

代碼:

class Solution {
public:int minCut(string s) {int n = s.size();vector<vector<bool>> isPal(n, vector<bool>(n, 0));for(int i = n - 1; i >= 0; i--){for(int j = i; j < n; j++){if(s[i] == s[j])isPal[i][j] = i + 1 < j ? isPal[i + 1][j - 1] : true;}}// 對 isPal 做 dpvector<int> dp(n, INT_MAX / 2);for(int i = 0; i < n; i++){if(isPal[0][i]) dp[i] = 0; // 判斷 0 - ielse{for(int j = 1; j <= i; j++){if(isPal[j][i])dp[i] = min(dp[i], dp[j - 1] + 1);}}}return dp[n - 1];}
};

時間復雜度: O ( n 2 ) O(n^2) O(n2)
空間復雜度: O ( n 2 ) O(n^2) O(n2)


516. 最長回文子序列

題目鏈接:https://leetcode.cn/problems/longest-palindromic-subsequence/description/
在這里插入圖片描述


優質解

思路

狀態表示

  • dp[i][j]: [i, j]區間內的所有子序列中,最長的回文子序列

狀態轉移方程

  • if s[i] == s[j], 那 dp[i][j] = dp[i + 1][j - 1] + 1;
    • 無效區間(越界), i + 1 < j : dp[i][i] = 字符個數;
  • if s[i] != s[j] (代表兩端不會同時對構成回文子序列有幫助)
    • 去[i + 1, j] 和 [i, j - 1] 兩個區間找: max(dp[i][j - 1], dp[i + 1][j]);

初始化:

  • 發現只有[0][0][i - 1][i - 1] 會越界(但是狀態轉移方程已經處理了)
    填表順序

填表順序

  • 看狀態轉移需要什么位置的 dp 值
    • 整體行: 從下到上(因為需要 i - 1),
    • 每一行內部: 從左往右(因為要 j - 1)

返回值

  • dp[0][n - 1];

代碼:

class Solution {
public:int longestPalindromeSubseq(string s) {int n = s.size();vector<vector<int>> dp(n, vector<int>(n, 0));for(int i = n - 1; i >= 0; i--){dp[i][i] = 1; // 初始化for(int j = i + 1; j < n; j++) // 枚舉右端{if(s[i] == s[j])dp[i][j] = i + 1 == j ? 2 : dp[i + 1][j - 1] + 2;else dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]);}}return dp[0][n - 1];}
};

時間復雜度: O ( n 2 ) O(n^2) O(n2)
空間復雜度: O ( n 2 ) O(n^2) O(n2)


1312. 讓字符串成為回文串的最少插入次數

題目鏈接:https://leetcode.cn/problems/minimum-insertion-steps-to-make-a-string-palindrome/description/
在這里插入圖片描述


優質解

思路:

  • 總體思路和上一題都差不多
  • 狀態表示:dp[i][j][i, j]區間的子串,成為回文串的最小插入次數
  • 狀態轉移方程:s[i] == s[j]...不多說了,s[i] != s[j]...
  • 細節問題不說了

代碼:

class Solution {
public:int minInsertions(string s) {int n = s.size();vector<vector<int>> dp(n, vector<int>(n, INT_MAX));for(int i = n - 1; i >= 0; i--){dp[i][i] = 0;for(int j = i + 1; j < n; j++){if(s[i] == s[j])dp[i][j] = i + 1 == j? 0 : dp[i + 1][j - 1];elsedp[i][j] = min(dp[i + 1][j], dp[i][j - 1]) + 1;}}return dp[0][n - 1];}
};

時間復雜度: O ( n 2 ) O(n^2) O(n2)
空間復雜度: O ( n 2 ) O(n^2) O(n2)


🌈我的分享也就到此結束啦🌈
要是我的分享也能對你的學習起到幫助,那簡直是太酷啦!
若有不足,還請大家多多指正,我們一起學習交流!
📢公主,王子:點贊👍→收藏?→關注🔍
感謝大家的觀看和支持!祝大家都能得償所愿,天天開心!!!

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

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

相關文章

Ubuntu22.04.5 桌面版然后安裝 VMware 17

安裝 VMware 需要 GCC 12版本 標題通過 PPA 安裝 這是最簡單的方法&#xff0c;適用于大多數 Ubuntu 版本。 步驟 1&#xff1a;添加 PPA 倉庫 sudo apt update sudo apt install software-properties-common sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt…

深入解析 MySQL 架構:從基礎到高級

MySQL 是一款廣泛使用的開源關系型數據庫管理系統&#xff0c;以其高性能、可靠性和靈活性而聞名。無論是小型創業公司還是大型企業&#xff0c;MySQL 都是許多應用程序的首選數據庫解決方案。本文將深入探討 MySQL 的架構設計&#xff0c;幫助讀者更好地理解其內部工作機制&am…

BACnet協議移植適配實現BACnet/IP和BACnet MSTP相關功能

1、從GitHub或者其他網站下載最新的協議棧源碼 源碼結構如圖所示&#xff1a; 其中src是協議棧源碼&#xff0c;可直接拿來使用&#xff0c;apps里面是一些功能的應用示例&#xff0c;有BACnet IP&#xff0c;BACnet MSTP&#xff0c;BACnet Router等功能。 2、協議棧移植完成…

Ubuntu 22.04.1 LTS 離線安裝Docker(最快方法,僅需一個壓縮文件和兩個腳本)

作者親測&#xff1a;親測有效無bug。 利用ubuntu22.04下載完docker-27.4.1.tgz,然后按照下面方法安裝。選擇sudo方法。 tips:這個ubuntu22.04是遷移后的服務器的版本&#xff0c;不是遷移前的版本。 下載 下載地址 : https://download.docker.com/linux/static/stable/x86_…

Tkinter --按鈕點擊事件應用場景

第二章 事件處理 目錄 第二章 事件處理 四、事件處理 4.1 按鈕點擊事件 4.1.1信息展示類場景 1. 靜態文本說明 ?編輯 2. 動態狀態顯示 4.1.2.界面美化與裝飾 1. 圖像 / 圖標展示 ?編輯 2. 分隔與布局輔助 4.1.3 交互反饋與提示 1. 操作結果提示 2. 幫助與說明文本…

計算機網絡學習筆記:TCP流控、擁塞控制

文章目錄 前言一、TCP流量控制1.1、案例&#xff1a;三次流量控制1.2、持續計時器 二、TCP擁塞控制2.1、擁塞控制的指標2.2、慢開始算法和擁塞避免算法2.3、快重傳算法和快恢復算法2.4、練習 三、TCP擁塞控制與網際層擁塞控制總結 前言 TCP協議中的流量和擁塞&#xff0c;是兩個…

【Linux】Tomcat搭建

前言 Tomcat Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器&#xff0c;屬于輕量級應用服務器&#xff0c;在中小型系統和并發訪問用戶不是很多的場合下被普遍使用&#xff0c;是開發和調試JSP 程序的首選。 JSP JSP是一種跨平臺的動態網頁技術標準&#xff0c;可以…

Ajax 核心知識點全面總結

文章目錄 Ajax 核心知識點全面總結一、Ajax 基礎概念1、定義2、核心特點 二、Ajax 工作原理與核心組件1、工作流程2、XMLHttpRequest&#xff08;XHR&#xff09;對象 三、Ajax 請求方法與參數1、常見請求方法2、請求參數處理 四、Ajax 異步與錯誤處理1、異步處理2、錯誤處理 五…

SpinFlowSim:用于癌癥組織學信息驅動的擴散MRI微血管映射的血流模擬框架|文獻速遞-深度學習醫療AI最新文獻

Title 題目 SpinFlowSim: A blood flow simulation framework for histology-informeddiffusion MRI microvasculature mapping in cancer SpinFlowSim&#xff1a;用于癌癥組織學信息驅動的擴散MRI微血管映射的血流模擬框架 01 文獻速遞介紹 在擴散磁共振成像&#xff08…

量化面試綠皮書:21. 拋硬幣游戲

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 21. 拋硬幣游戲 兩個賭徒正在玩一個拋硬幣游戲。 賭徒A有(n1)枚均勻硬幣&#xff0c;賭徒B有n枚均勻硬幣。 Q: 如果兩人同時拋擲所有硬幣&a…

OpenLayers 框架體系

注&#xff1a;當前使用的是 ol 9.2.4 版本&#xff0c;天地圖使用的key請到天地圖官網申請&#xff0c;并替換為自己的key OpenLayers框架組織結構龐大&#xff0c;只通過官網API進行查看&#xff0c;對框架結構缺少一個整體、全面的看法。借助樹形結構圖或思維導圖&#xff0…

緩存系統-基本概述

目錄 一、系統概述 二、名詞解釋 三、淘汰策略 1、LRU 2、LFU 3、FIFO 4、TTL 5、Random 四、讀寫模式 1、Cache Aside&#xff08;旁路緩存&#xff09; 2、Write Through&#xff08;直寫&#xff09; 3、Write Back&#xff08;回寫&#xff09; 五、問題方案 …

基于GNU Radio Companion搭建的BPSK收發通信實驗

目錄 一、實驗目的和要求 二、實驗內容 1.Lab5 仿真設計一個BPSK的數字收發射系統 Lab6 實際使用RTLSDR解調BPSK信號 一、實驗目的和要求 1.了解軟FM的工作方式和原理,數字通信的碼間串擾及星座圖 2.掌握并正確使用RTL-SDL硬件和Gnuradio軟件 3.正確使用Gnraduo軟件,建…

華為OD機試-返回矩陣中非1的元素、個數/數值同化-BFS(JAVA 2025B卷)

import java.util.*;/*** author 308413* version Ver 1.0* date 2025/6/18* description 返回矩陣中非1的元素*/ public class Non1ElementInMatrix {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int N scanner.nextInt();int M scan…

Redis學習筆記——黑馬點評 消息隊列25-30

前言&#xff1a; 學習收獲&#xff1a; Redis消息隊列&#xff1a; 消息隊列&#xff08;Message Queue&#xff09;&#xff0c;字面意思就是存放消息的隊列。最簡單的消息隊列包括3個角色&#xff1a; 消息隊列&#xff1a;存儲和管理消息&#xff0c;也被稱為消息代理生…

基于Django+Vue3的草莓病害檢測系統設計與實現,Web前后端分離,YOLOv8 Web目標檢測系統

這里寫自定義目錄標題 基于DjangoVue3的草莓病害檢測系統 基于DjangoVue3的草莓病害檢測系統 本項目結合 YOLOv8 與 Django Vue3 &#xff0c;構建了一個通用的 Web 前后端系統&#xff0c;便于用戶進行目標檢測的操作和展示&#xff0c;實現對圖片、視頻實時目標檢測和攝像頭…

【MFC】樹控件的使用詳解

目錄 添加線條鏈接 添加折疊小按鈕 設置樹控件的節點和對應的圖標 設置默認選中項 設置選中項切換響應函數 涉及接口介紹&#xff1a; 首先我們通過資源視圖可以添加一個樹形控件&#xff0c;如下&#xff1a; 添加線條鏈接 在樹形控件中&#xff0c;有一個屬性“Has…

跨境賣家警報。抽繩背包版權案立案,TRO在即速排查

近日Shenzhenshi Jingyida Trading Co., LTD委托律所Dewitty And Associates, Chtd.對其熱銷的抽繩設計多功能運動背包發起跨境版權維權&#xff0c;保護范圍涵蓋產品外觀設計。 案件基本情況&#xff1a; 起訴時間&#xff1a;2025-6-12 案件號&#xff1a;25-cv-06509 原…

Android Activity全面解析:從創建到生命周期的完整指南

Activity作為Android四大組件之一&#xff0c;是構建用戶界面的核心單元。筆者通過郭霖著的第一行代碼入門安卓&#xff0c;內容基本都取自書中&#xff0c;這篇博客作為筆者的筆記同時精簡了一些書中內容分享在csdn中 一、Activity的創建與基礎配置 1.1 創建Activity的基本步…

深入理解 Python 的 secrets 模塊:打造更安全的隨機數生成機制

深入理解 Python 的 secrets 模塊&#xff1a;打造更安全的隨機數生成機制 在構建涉及用戶身份認證、權限管理、加密通信等系統時&#xff0c;開發者最不能忽視的一個問題就是“安全性”。安全問題的核心之一在于“隨機性”——尤其是密碼、驗證碼、Token、Session、API Key 的…