回文子串、回文子序列相關題目

回文子串、回文子序列相關題目

回文子串是要連續的,回文子序列可不是連續的。

516. 最長回文子序列

dp數組含義dp[i][j]dp[i][j]dp[i][j] 表示子序列 s[i,j]s[i,j]s[i,j] 中的最長回文子序列的長度。

dp數組初始化:子序列長度為 1 時,最長回文子序列的長度就是 1, 即s[i,i]=1s[i,i]=1s[i,i]=1

遞推公式

  • 如果 s[i]==s[j]s[i]==s[j]s[i]==s[j] ,那么相比于 s[i+1,j?1]s[i+1,j-1]s[i+1,j?1]s[i,j]s[i,j]s[i,j] 的最長子序列的長度增加了 2(首尾)
  • 如果 s[i]≠s[j]s[i]\ne s[j]s[i]?=s[j],那么 s[i,j]s[i,j]s[i,j] 的最長子序列的長度就是 s[i+1,j],s[i,j?1]s[i+1,j],s[i,j-1]s[i+1,j],s[i,j?1] 中的較大者(取首或者取尾)

遍歷順序

這里順序比較講究,我們知道,動態規劃解法的遍歷順序需要遵循的原則要按照遞推公式的依賴關系,即遞推公式中計算 dp 數組中的某個值時一定要保證它所依賴的值已經在 dp 數組中被計算好了

在本題中,我們看到遞推公式中,dp[i][j]dp[i][j]dp[i][j] 的值依賴于三個值:dp[i+1][j?1]dp[i+1][j-1]dp[i+1][j?1]dp[i+1][j]dp[i+1][j]dp[i+1][j]dp[i][j?1]dp[i][j-1]dp[i][j?1],我們所選擇的遍歷順序需要保證在計算 dp[i][j]dp[i][j]dp[i][j] 時這三個值都已經計算過了,那么很明顯的,iii 要從大往小,jjj 要從小往大。

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

5. 最長回文子串

dp數組含義dp[i][j]dp[i][j]dp[i][j] 表示子串 s[i,j]s[i, j]s[i,j] 是否為回文串。

dp數組初始化:長度為 1 的子串,即 s[i,i]s[i,i]s[i,i] 一定是回文串。

遞推公式

  • 如果 s[i]≠s[j]s[i]\ne s[j]s[i]?=s[j],那么 s[i,j]s[i,j]s[i,j] 一定不是回文串;
  • 如果 s[i]==s[j]s[i]==s[j]s[i]==s[j], 那要再看子串的長度:
    • 如果子串長度小于等于 3, 那 s[i,j]s[i,j]s[i,j] 一定是回文串
    • 如果子串長度大于 3,則 s[i,j]s[i,j]s[i,j] 是不是回文串就取決于 s[i+1][j?1]s[i+1][j-1]s[i+1][j?1] 是不是回文串。如 sabas 是不是回文串取決于 aba 是不是回文串。

遍歷順序

外層循環遍歷子串的長度,內層循環遍歷起始位置,這里也可以考慮與上面類似的遍歷順序思路,會在下一題中給出代碼。

class Solution {
public:string longestPalindrome(string s) {int n = s.size();if (n < 2) return s;string ans(1, s[0]);vector<vector<bool>> dp(n, vector<bool> (n));for (int i=0; i<n; ++i) dp[i][i] = true;for (int len=2; len<=n; ++len) {for (int i=0; i<n; ++i) {int j = i + len - 1;if (j >= n) break;if (s[i] != s[j]) dp[i][j] = false;else {if (len <= 3) dp[i][j] = true;else dp[i][j] = dp[i+1][j-1];}if (dp[i][j] && len>ans.size()) ans = s.substr(i, len);}}return ans;}
};

647. 回文子串

思路和上一題邏輯類似

遍歷順序一,與上題一致

class Solution {
public:int countSubstrings(string s) {int n = s.size();if (n < 2) return n;vector<vector<bool>> dp(n, vector<bool> (n));for (int i=0; i<n; ++i) dp[i][i] = true;int ans = n;for (int len=2; len<=n; ++len) {for (int i=0; i<n; ++i) {int j = i + len - 1;if (j >= n) break;if (s[i] != s[j]) dp[i][j] = false;else {if (len <= 3) {dp[i][j] = true;++ans;}else {if (dp[i+1][j-1]) {dp[i][j] = true;++ans;}else dp[i][j] = false;}}}}return ans;}
};

另一種根據長度和起始位置的遍歷順序,思路類似題516:

class Solution {
public:int countSubstrings(string s) {int n = s.size();int ans = 0;vector<vector<bool>> dp(n, vector<bool> (n, false));for (int i=n-1; i>=0; --i) {for (int j=i; j<n; ++j) {if (s[i] == s[j]) {if (abs(i-j) <= 1) {dp[i][j] = true;++ans;}else {if (dp[i+1][j-1]) {dp[i][j] = true;++ans;}}}}}return ans;}
};

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

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

相關文章

mmdetection tools工具梳理

mmdetection tools工具梳理 mmdetection 是一個非常好用的開源目標檢測框架&#xff0c;我們可以用它方便地訓練自己的目標檢測模型&#xff0c;mmdetection 項目倉庫提供許多實用的工具來實現幫助我們進行各種測試。本篇將梳理以下 mmdetection 項目倉庫 tools 目錄下的各種實…

TensorRT ONNX 基礎(續)

TensorRT ONNX 基礎&#xff08;續&#xff09; PyTorch正確導出ONNX 幾條推薦的原則&#xff0c;可以減少潛在的錯誤&#xff1a; 對于任何使用到 shape、size 返回值的參數時&#xff0c;例如 tensor.view(tensor.size(0), -1) 這類操作&#xff0c;避免直接使用 tensor.s…

frp實現內網穿透極簡教程

frp實現內網穿透極簡教程 本文是內網穿透極簡教程&#xff0c;為求簡潔&#xff0c;我們不介紹為什么內網穿透也不介紹其原理&#xff0c;這里假設各位讀者都已經明確的知道自己的目的&#xff0c;本文僅介紹如何安裝配置 frp 實現內網穿透。 簡單來說&#xff0c;內網穿透就…

圖像預處理之warpaffine與雙線性插值及其高性能實現

圖像預處理之warpaffine與雙線性插值及其高性能實現 視頻講解&#xff1a;https://www.bilibili.com/video/BV1ZU4y1A7EG 代碼Repo&#xff1a;https://github.com/shouxieai/tensorRT_Pro 本文為視頻講解的個人筆記。 warpaffine矩陣變換 對于坐標點的變換&#xff0c;我們通…

LeetCode-10 正則表達式匹配

LeetCode-10 正則表達式匹配 動態規劃 10. 正則表達式匹配 dp數組含義&#xff1a;dp[i][j]dp[i][j]dp[i][j] 表示 s[0:i?1]s[0:i-1]s[0:i?1] 能否被 p[0:j?1]p[0:j-1]p[0:j?1] 成功匹配。 狀態轉移方程 &#xff1a; 如果 s[i?1]p[j?1]s[i-1]p[j-1]s[i?1]p[j?1] …

shell if判斷和for循環常見寫法

shell if判斷和for循環常見寫法 轉自&#xff1a; Shell中for循環的幾個常用寫法 Shell中if 條件判斷總結 if常見寫法 一、if的基本語法: if [ command ];then符合該條件執行的語句 elif [ command ];then符合該條件執行的語句 else符合該條件執行的語句 fibash shell會按順序…

關于pytorch使用多個dataloader并使用zip和cycle來進行循環時出現的顯存泄漏的問題

關于pytorch使用多個dataloader并使用zip和cycle來進行循環時出現的顯存泄漏的問題 如果我們想要在 Pytorch 中同時迭代兩個 dataloader 來處理數據&#xff0c;會有兩種情況&#xff1a;一是我們按照較短的 dataloader 來迭代&#xff0c;長的 dataloader 超過的部分就丟棄掉…

neovim及coc.nvim自動補全初探

neovim及coc.nvim自動補全初探 安裝 # mac # 安裝 brew install neovim # 查看neovim安裝路徑 brew list nvim# ubuntu apt install neovim習慣了打開 vi/vim 的方式&#xff0c;可以用個 alias 在 ~/.zshrc 中設置一下&#xff1a; alias vi"nvim"插件 vim-plug…

sed 簡明教程

sed 簡明教程 轉自&#xff1a;https://coolshell.cn/articles/9104.html awk于1977年出生&#xff0c;今年36歲本命年&#xff0c;sed比awk大2-3歲&#xff0c;awk就像林妹妹&#xff0c;sed就是寶玉哥哥了。所以 林妹妹跳了個Topless&#xff0c;他的哥哥sed坐不住了&#xf…

awk 簡明教程

awk 簡明教程 轉自&#xff1a;https://coolshell.cn/articles/9070.html 有一些網友看了前兩天的《Linux下應該知道的技巧》希望我能教教他們用awk和sed&#xff0c;所以&#xff0c;出現了這篇文章。我估計這些80后的年輕朋友可能對awk/sed這類上古神器有點陌生了&#xff0c…

應該知道的LINUX技巧

應該知道的LINUX技巧 轉自&#xff1a;https://coolshell.cn/articles/8883.html 這篇文章來源于Quroa的一個問答《What are some time-saving tips that every Linux user should know?》—— Linux用戶有哪些應該知道的提高效率的技巧。我覺得挺好的&#xff0c;總結得比較好…

[深度][PyTorch] DDP系列第一篇:入門教程

[深度][PyTorch] DDP系列第一篇&#xff1a;入門教程 轉自&#xff1a;[原創][深度][PyTorch] DDP系列第一篇&#xff1a;入門教程 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好&#xff1f;那你definitely需要這一篇&#xff01; No one knows DDP better than I…

[深度][PyTorch] DDP系列第二篇:實現原理與源代碼解析

[深度][PyTorch] DDP系列第二篇&#xff1a;實現原理與源代碼解析 轉自&#xff1a;https://zhuanlan.zhihu.com/p/187610959 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好&#xff1f;那你definitely需要這一篇&#xff01; No one knows DDP better than I do! …

[深度][PyTorch] DDP系列第三篇:實戰與技巧

[深度][PyTorch] DDP系列第三篇&#xff1a;實戰與技巧 轉自&#xff1a;https://zhuanlan.zhihu.com/p/250471767 零. 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好&#xff1f;那你definitely需要這一篇&#xff01; No one knows DDP better than I do! – – …

PIL、OpenCV中resize算子實現不同的問題

PIL、OpenCV中resize算子實現不同的問題 測試圖像&#xff1a;https://raw.githubusercontent.com/TropComplique/ssd-pytorch/master/images/dogs-and-cats.jpg &#xff08;直接 wget 可獲得&#xff09; 測試版本&#xff1a; opencv-python 4.4.0.46Pillow 8.0.1 測試代…

mac X11 XQuartz的安裝與使用

mac X11 XQuartz的安裝與使用 本地系統&#xff1a;MacOS 12.4 遠程主機系統&#xff1a;Ubuntu 18.04 命令說明 ssh命令 ssh 命令大家很熟悉了&#xff0c;這里僅介紹與 X11 forwarding 相關的幾個選項。 本部分譯自 ssh 命令手冊&#xff0c;可見 man ssh -X &#xf…

機器學習:系統設計與實現 分布式訓練

機器學習系統:設計與實現 分布式訓練 轉自&#xff1a;https://openmlsys.github.io/chapter_distributed_training/index.html 隨著機器學習的進一步發展&#xff0c;科學家們設計出更大型&#xff0c;更多功能的機器學習模型&#xff08;例如說&#xff0c;GPT-3&#xff09;…

Linux命令行及各常用工具代理設置

Linux命令行及各常用工具代理設置 命令行代理設置 1 通過命令行指定 直接為當前命令行設置代理 對當前終端的全部工具&#xff08;apt、curl、wget、git 等全都有效&#xff09;以下僅以 http 代理為例&#xff0c;如果是其他協議&#xff08;如 socks 等&#xff09;自行改…

VimScript 五分鐘入門(翻譯)

VimScript 五分鐘入門&#xff08;翻譯&#xff09; 轉自&#xff1a;https://zhuanlan.zhihu.com/p/37352209 譯注&#xff1a;折騰 Vim 當然要能看懂和改寫相關腳本&#xff0c;而中文資料匱乏&#xff0c;缺一個提綱挈領的教程。本文翻譯自 Andrew Scala 的 《Five Minute V…

C++多線程推理、生產者消費者模式封裝

C多線程推理、生產者消費者模式封裝 tensorRT從零起步邁向高性能工業級部署&#xff08;就業導向&#xff09; 課程筆記&#xff0c;講師講的不錯&#xff0c;可以去看原視頻支持下。 深度學習推理中的多線程知識概覽 本章介紹的多線程主要是指算法部署時所涉及的多線程內容&a…