leetcode 516. 最長回文子序列(JAVA)題解

題目鏈接https://leetcode.cn/problems/longest-palindromic-subsequence/description/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china

目錄

題目描述:

暴力遞歸:

動態規劃:


題目描述:

給你一個字符串?s?,找出其中最長的回文子序列,并返回該序列的長度。子序列定義為:不改變剩余字符順序的情況下,刪除某些字符或者不刪除任何字符形成的一個序列。

示例 1:

輸入:s = "bbbab"
輸出:4
解釋:一個可能的最長回文子序列為 "bbbb" 。

示例 2:

輸入:s = "cbbd"
輸出:2
解釋:一個可能的最長回文子序列為 "bb" 。

提示:

  • 1 <= s.length <= 1000
  • s?僅由小寫英文字母組成

這道題的知識點是動態規劃,可是如果直接從動態規劃講可能有點不容易理解。

所以本篇文章就是從暴力遞歸到動態規劃

從題目中我們可以得出:本題找的是可以不連續的回文子串然后返回其最大序列的長度。

也就是說:

a2b42a

的最長回文子序列為:a2b2a或a242a 這兩個都可以因為它們返回的都是5

暴力遞歸:

我們先寫一個可以返回最長的回文子序列長度的函數:

//主函數
public int longestPalindromeSubseq(String s) {char[] str = s.toCharArray();return maxString(str, 0, str.length-1);
}//假設該函數可以返回最長回文子序列的長度
public static int maxString(char[] str, int l, int r) {}

我們寫的 maxString() 方法可以返回 str 字符串[l, r]區間的最長回文子序列的長度?。

通過分析可以得出以下結論:

兩種特殊情況:

  • 首先我們可以得到當 l 和 r 相等就證明此時只有一個字符那么它的返回值就是 1
  • 如果傳入的數組只有兩個字符即 l + 1 == r?那么此時如果這兩個字符相等就返回 2 ,如果不相等就返回 1

普遍情況:

  • 兩邊的字符不存在于最長的回文子序列中。例:a1221b? ? ->? ?1221;
  • 右邊的字符不存在在于最長的回文子序列中。例:1221b? ? ->? ?1221;
  • 左邊的字符不存在在于最長的回文子序列中。例:a1221? ? ->? ?1221;
  • 兩邊的字符存在于最長的回文子序列中。例:1w221? ? ->? ?1221。

?此時代碼就可以這樣寫:

//主函數
public int longestPalindromeSubseq(String s) {char[] str = s.toCharArray();return maxString(str, 0, str.length-1);
}//假設該函數可以返回最長回文子序列的長度
public static int maxString(char[] str, int l, int r) {//先判斷兩種特殊情況if (l == r){return 1;}if (l + 1 == r){return str[l] == str[r] ? 2 : 1;}//余下的四種情況int a1 = maxString(str, l + 1, r - 1);int a2 = maxString(str, l, r - 1);int a3 = maxString(str, l + 1, r);int a4 = str[l] == str[r] ? 2 + maxString(str, l + 1, r - 1) : 0;//因為題目要求返回最長序列長度  所以需要返回這四個的最大值return Math.max(Math.max(a1, a2), Math.max(a3, a4));
}

?此時我們可以提交以下:

?雖然沒通過但是從它的報錯信息可以看出,我們的思路是沒問題的。

動態規劃:

我們有了遞歸版本后就可以根據它來寫出動態規劃版本了。

?因為在maxString() 方法中只有 l 和 r 是變量,而它們兩個的取值范圍都是 [0,str.length - 1]?

此時我們就可以通過創建一個二維數組將?l 和 r 所有情況都列舉出來然后返回數組[0,str.length - 1] 下標的值就可以得出答案了。

我們先假設長度只有 5 ,那么我們就可以創建如下的二維數組 l 行,r 列

public static int maxString(char[] str, int l, int r) {int[][] arr = new int[str.length][str.length];}

?

接下來的填表階段就可以根據遞歸函數直接填(以“a1221”為例子):?

?

?

此時 [0, 4] 位置的值就是最終答案。?

?根據每個位置的關系就將遞歸優化成:

public static int maxString(char[] str, int l, int r) {int[][] arr = new int[str.length][str.length];//因為不存在l < r的情況所以下三角的空間不用for (int i = 0; i < str.length; i++) {if (i == 0){//填第一條對角線int j = 0;while(j < str.length) {arr[j][j] = 1;j++;}}else if (i == 1) {//填第二條斜線int j = 1;while(j < str.length) {arr[j - 1][j] = (str[j - 1] == str[j]) ? 2 : 1;j++;}}else {//其他int j = i;int k = 0;while(j < str.length){int a1 = arr[k + 1][j - 1];int a2 = arr[k][j - 1];int a3 = arr[k + 1][j];int a4 = str[k] == str[j] ? 2 + arr[k + 1][j - 1] : 0;arr[k][j] = Math.max(Math.max(a1, a2), Math.max(a3, a4));j++;k++;}}}return arr[0][str.length-1];
}

此時再提交就過了。?

?

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

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

相關文章

Python學習過程筆記:主模塊(main) 異常處理 命令行參數解析 日志記錄 socket模塊 類的私有方法 字節字符串

文章目錄 1.Python中的主程序2.Python中的異常處理3.Python中的命令行參數解析4.Python中的日志記錄5.網絡編程socket模塊6.Python中的私有方法7.Python中的字節字符串 1.Python中的主程序 if __name__ __main__在Python中&#xff0c;if __name__ __main__ 是一個常見的代碼…

百日筑基篇——python爬蟲學習(一)

百日筑基篇——python爬蟲學習&#xff08;一&#xff09; 文章目錄 前言一、python爬蟲介紹二、URL管理器三、所需基礎模塊的介紹1. requests2. BeautifulSoup1. HTML介紹2. 網頁解析器 四、實操1. 代碼展示2. 代碼解釋1. 將大文件劃分為小的文件&#xff08;根據AA的ID數量劃…

簡單認識Zabbix監控系統及配置

文章目錄 一、zabbix概述1、定義2、zabbix監控原理3、監控對象4、zabbix的3種架構&#xff08;1&#xff09; C/S架構&#xff08;2&#xff09;分布式架構&#xff1a;zabbix-proxy-client架構&#xff08;3&#xff09; master-node-client架構 5、zabbix監控模式 二、部署za…

項目實戰 — 消息隊列(8){網絡通信設計①}

目錄 一、自定義應用層協議 &#x1f345; 1、格式定義 &#x1f345; 2、準備工作 &#x1f384;定義請求和響應 &#x1f384; 定義BasicArguments &#x1f384; 定義BasicReturns &#x1f345; 2、創建參數類 &#x1f384; 交換機 &#x1f384; 隊列 &#x1f38…

【網絡】傳輸層——TCP(滑動窗口流量控制擁塞控制延遲應答捎帶應答)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;專欄&#xff1a;《網絡》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交給時間&#xff01; 上篇文章對TCP可靠性機制講解了一部分&#xff0c;這篇文章接著繼續講解。 &#x1f3a8;滑動窗口 在…

Springboot 實踐(2)MyEclipse2019創建項目修改pom文件,加載springboot 及swagger-ui jar包

MyEclipse2019創建工程之后&#xff0c;需要添加Springboot啟動函數、添加application.yml配置文件、修改pom文件添加項目使用的jar包。 添加Springboot啟動函數 創建文件存儲路徑 &#xff08;1&#xff09;右鍵單擊“src/main/java”文件夾&#xff0c;彈出對話框輸入路徑…

Android 簡單的視頻、圖片壓縮工具

首頁需要壓縮的工具包 1.Gradle implementation com.iceteck.silicompressorr:silicompressor:2.2.3 2.添加相關權限&#xff08;手機得動態申請權限&#xff09; <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/> <uses-p…

05 - 研究 .git 目錄

查看所有文章鏈接&#xff1a;&#xff08;更新中&#xff09;GIT常用場景- 目錄 文章目錄 1. HEAD2. config3. refs4. objects 1. HEAD 2. config 3. refs 4. objects Git對象一共有三種&#xff1a;數據對象 blob、樹對象 tree以及提交對象 commit&#xff0c;這些對象都被保…

Vue 目錄結構 vite 項目

Vue3 項目常用的目錄結構和每個文件的作用【通過 vite 創建的項目】 vite目錄結構&#xff1a; dist // 打包后生成的文件目錄 node_modules // 環境依賴 public // 公共資源目錄 favicon.ico …

深入探析設計模式:工廠模式的三種姿態

深入探析設計模式&#xff1a;工廠模式的三種姿態 1. 簡單工廠模式1.1 概念1.2 案例1.3 優缺點 2. 抽象工廠模式2.1 概念2.2 案例&#xff1a;跨品牌手機生產2.3 優缺點 3. 超級工廠模式3.1 概念3.2 案例&#xff1a;動物園游覽3.3 優缺點 4. 總結 歡迎閱讀本文&#xff0c;今天…

go入門實踐四-go實現一個簡單的tcp-socks5代理服務

文章目錄 前言socks協議簡介go實現一個簡單的socks5代理運行與壓測抓包驗證 前言 SOCKS是一種網絡傳輸協議&#xff0c;主要用于客戶端與外網服務器之間通訊的中間傳遞。協議在應用層和傳輸層之間。 本文使用先了解socks協議。然后實現一個socks5的tcp代理服務端。最后&#…

英語詞法——代詞

代詞是用來代替名詞、起名詞作用的短語、分句和句子的詞。英語中代詞根據其意義和作用可分為九類:人稱代詞、物主代詞、反身代詞、相互代詞、指示代詞、疑問代詞、不定代詞、關系代詞和連接代詞。 第一節 人稱代詞 一、人稱代詞的形式和用法 人稱代詞單數復數第一人稱第二人…

【ARM 嵌入式 編譯系列 4 -- GCC 編譯屬性 __read_mostly 詳細介紹】

文章目錄 __read_mostly 介紹__read_mostly 在 linux 中的使用.data.read_mostly 介紹 __read_mostly 介紹 __read_mostly 是一個在Linux內核編程中用到的宏定義&#xff0c;這是一個gcc編譯器的屬性&#xff0c;用于告訴編譯器此變量主要用于讀取&#xff0c;很少進行寫入&am…

MYSQL中用字符串2022-07去匹配Date類型大于2022-07-01并小于2022-07-31

正文 需求上&#xff0c;是有個日期字符串&#xff0c;例如2022-07&#xff0c;代表著年月。數據庫中表對于這個字段存的是年月日&#xff0c;例如&#xff1a;2022-07-15。 我希望的是&#xff1a;獲取到2022-07-01到2022-07-31&#xff0c;之間的數據&#xff0c;條件是&…

21款美規奔馳GLS450更換中規高配主機,漢化操作更簡單

很多平行進口的奔馳GLS都有這么一個問題&#xff0c;原車的地圖在國內定位不了&#xff0c;語音交互功能也識別不了中文&#xff0c;原廠記錄儀也減少了&#xff0c;使用起來也是很不方便的。 可以實現以下功能&#xff1a; ①中國地圖 ②語音小助手&#xff08;你好&#xf…

【BASH】回顧與知識點梳理(二十六)

【BASH】回顧與知識點梳理 二十六 二十六. 二十一至二十五章知識點總結及練習26.1 總結26.2 模擬26.3 簡答題 該系列目錄 --> 【BASH】回顧與知識點梳理&#xff08;目錄&#xff09; 二十六. 二十一至二十五章知識點總結及練習 26.1 總結 Linux 操作系統上面&#xff0c…

unittest單元測試

當你在編寫測試用例時&#xff0c;可以使用Python內置的unittest模塊來進行單元測試。下面是一個逐步指南&#xff0c;幫助你理解如何編寫和運行基本的單元測試。 導入必要的模塊&#xff1a; 首先&#xff0c;你需要導入unittest模塊和需要測試的模塊&#xff08;例如&#xf…

運維監控學習筆記8

在服務器端&#xff0c;我們添加了nginx-server的主機&#xff1a; 在解決Error問題的過程中&#xff0c;我還通過zabbix_get這個命令進行了測試&#xff0c;發現是沒有的&#xff0c;后來確認是在web頁面配置的過程中&#xff0c;我輸錯了密碼。 yum install zabbix-getzabbi…

uniapp-原生地圖截屏返回base64-進行畫板編輯功能

一、場景 vue寫uniapp打包安卓包&#xff0c;實現原生地圖截屏&#xff08;andirod同事做的&#xff09;-畫板編輯功能 實現效果&#xff1a; 二、邏輯步驟簡略 1. 由 原生地圖nvue部分&#xff0c;回調返回 地圖截屏生成的base64 數據&#xff0c; 2. 通過 uni插件市場 im…

《圖解HTTP》——HTTP協議詳解

一、HTTP協議概述 HTTP是一個屬于應用層的面向對象協議&#xff0c;由于其簡捷、快速的方式&#xff0c;適用于分布式超媒體信息系統。它于1990年提出&#xff0c;經過幾年的使用與發展&#xff0c;得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版&#xff0c;HTTP…