代碼隨想錄打卡第38天:動態規劃解決編輯距離和回文串

1.72編輯距離

1.問題描述

找到其中需要進行操作的最少次數。

2.問題轉換

大體思路可以參照前面的兩個字符串的刪除操作。添加操作可以將其看做是一個另類的刪除操作,所以最后全部都可以看做是一個刪除操作

3.解題思路

  1. 每一個位置的word1[i]和word2[j]都有兩種狀態:是否相等
  2. 如果相等:那么不進行任何操作
  3. 如果不相等:那么此時有兩種情況:1.刪除word1[i](也可以是添加word1[i]到word2[j]的位置)。2.刪除word2[j](也可以看做是添加word2[j]到word1[i]的位置)確定其最小值就是最少操作次數。

4.為什么使用動態規劃?

因為每一個位置的狀態都能由前面的狀態遞推出來

5.動態規劃的具體實現

  1. dp[i][j]數組的含義:代表的是從word1[0..i]word2[0..j]最少需要操作的次數保證能夠完全匹配。
  2. 遞推公式:
    if(word1[i-1] == word2[j-1]){dp[i][j] = dp[i-1][j-1];}else{dp[i][j] = min(dp[i][j-1]+1,dp[i-1][j]+1);}
  3. 初始化:for(int i = 0;i<m+1;i++)dp[i][0] = i;for(int j = 1;j<n+1;j++)dp[0][j] = j;因為對于一個是空的字符串,另外一個非空,需要將其全部刪除,所以需要進行如下的初始化
  4. 遍歷順序:由遞推公式可以知道,應該是從上到下,從左到右的遍歷順序。
class Solution {
public:int minDistance(string word1, string word2) {int m = word1.size();int n = word2.size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));for(int i = 0;i<m+1;i++)dp[i][0] = i;for(int j = 1;j<n+1;j++)dp[0][j] = j;for(int i = 1;i<m+1;i++){for(int j = 1;j<n+1;j++){if(word1[i-1] == word2[j-1]){dp[i][j] = dp[i-1][j-1];}else{dp[i][j] = min({dp[i][j-1],dp[i-1][j],dp[i-1][j-1]})+1;}}}return dp[m][n];}
};

2.647回文子串

1.問題描述

找到其中回文子串的數目。回文字符串?是正著讀和倒過來讀一樣的字符串。

2.問題轉換

以i或者i,i+1為中心,向兩邊遍歷,相等則為一個回文子串。

3.解題思路

  1. 判斷s[i..j]是否是一個回文串。即判斷s[i]是否和s[j]相等
  2. 如果相等:如果里面的長度小于等于1,代表一定是回文串,如果里面的長度大于1的時候,判斷里面是否是回文串,如果是,那么此時是回文串,如果里面不是,那么此時就不是回文串。
  3. 如果不相等:那么一定不是回文串

4.為什么使用動態規劃?

因為每一個位置的狀態都能由前面的狀態遞推出來

5.動態規劃的具體實現

  1. dp[i][j]數組的含義:代表的是s[i..j]是否是一個回文串。
  2. 遞推公式:
    if(s[i]!=s[j]){dp[i][j] = false;}else{if (j - i <= 1) { // 情況一 和 情況二result++;dp[i][j] = true;} else if (dp[i + 1][j - 1]) { // 情況三result++;dp[i][j] = true;}}
  3. 初始化:vector<vector<bool>> dp(n,vector<bool>(n,false));默認情況下都不是回文子串,只有i==j的時候默認是回文串,可以在前面初始化,也可以直接在遍歷中設置。
  4. 遍歷順序:由遞推公式可以知道,i是從從大到小,j是從小到大,因為i代表左邊界,j代表的是右邊界,如果需要進行擴大的話,是需要向兩端擴的。
class Solution {
public:int countSubstrings(string s) {//第一種方法使用動態規劃的方式來確定回文子串/*int n = s.size();int result = 0;vector<vector<bool>> dp(n,vector<bool>(n,false));//代表的是表示區間范圍[i,j] (注意是左閉右閉)的子串是否是回文子串,如果是dp[i][j]為true,否則為false。for(int i = n-1;i>=0;i--){for(int j = i;j<n;j++){if(s[i]!=s[j]){dp[i][j] = false;}else{if (j - i <= 1) { // 情況一 和 情況二result++;dp[i][j] = true;} else if (dp[i + 1][j - 1]) { // 情況三result++;dp[i][j] = true;}}}}return result;*///第二種方式:使用二分法int n = s.size();int res = 0;for(int i = 0; i < n; ++i){for(int j = i, k = i; j >=0 && k < n; --j,++k)//以i為中心有多少個回文子串{if(s[j] != s[k]) break;++res;}for(int j = i, k = i+1; j >=0 && k < n; --j,++k)//以i,i+1兩個為整體有多少個回文子串{if(s[j] != s[k]) break;++res;}}return res;}
};

3.516最長回文子序列

1.問題描述

找到其中最長的回文子串的長度。

2.問題轉換

從[i..j]之間中最長的回文子串,只需要找到相同的就代表長度+2.

3.解題思路

  1. 求解s[i..j]最長回文子串的長度。即判斷s[i]是否和s[j]相等
  2. 如果相等:長度+2
  3. 如果不相等:那么在s[i+1..j]或者s[i..j-1]中找到最長的回文子串作為此時的長度

4.為什么使用動態規劃?

因為每一個位置的狀態都能由前面的狀態遞推出來

5.動態規劃的具體實現

  1. dp[i][j]數組的含義:代表的是s[i..j]的最長回文子串的長度。
  2. 遞推公式:
    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]);}
  3. 初始化:for(int i = 0;i<n;i++){//因為單個字符也是回文子序列dp[i][i] = 1;}
  4. 遍歷順序:由遞推公式可以知道,i是從從大到小,j是從小到大,因為i代表左邊界,j代表的是右邊界,如果需要進行擴大的話,是需要向兩端擴的。
class Solution {
public:int longestPalindromeSubseq(string s) {int n = s.size();vector<vector<int>> dp(n,vector<int>(n,0));//dp[i][j]:s[i,j]數組的最長的回文子序列for(int i = 0;i<n;i++){//因為單個字符也是回文子序列dp[i][i] = 1;}for(int i = n-2;i>=0;i--){//由于dp[i][j] = max(dp[i+1][j],dp[i][j-1]);所以i是從從大到小,j是從小到大,遞推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];}
};

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

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

相關文章

RTOS原理和應用總結

RTOS的作用 RTOS一般應用在中低端處理器當中&#xff0c;這里舉一個筆者日常開發遇到的案例來說明RTOS的作用。 假設你有一個設備&#xff0c;這個設備的外圍硬件很多&#xff0c;假設有LED、一個網口、若干RS232等等。 在沒有RTOS的時候&#xff0c;我們用裸機編程來寫&…

HTML5 多媒體應用技術

目錄 多媒體元素 audio元素video元素多媒體事件與JavaScript交互音頻和視頻軌道(Track)媒體API MediaElement APIMediaSource Extensions (MSE)Encrypted Media Extensions (EME)Web Audio API

數據庫同步軟件,天不生PanguSync萬古如長夜

在信息時代的海洋中&#xff0c;數據是那永不熄滅的燈塔&#xff0c;照亮了科技發展的航道。然而&#xff0c;隨著數據的膨脹和應用場景的多樣化&#xff0c;如何確保這些寶貴資源在不同平臺、不同設備間實時更新、保持一致性&#xff0c;便成了一道亟待解決的難題。于是&#…

Android File Transfer for mac(強大的安卓文件傳輸工具) 直裝版

Android File Transfer是一款專門為Mac用戶設計的軟件&#xff0c;它用于在Android設備與Mac之間傳輸文件。這款軟件提供了簡單直觀的操作界面&#xff0c;使用戶能夠輕松地在Android設備和Mac之間傳輸和管理文件。 下載地址&#xff1a;https://www.macz.com/mac/7099.html?i…

使用python實現socket進行消息傳輸-demo

Socket 是什么 Socket 是一種在計算機網絡中用于實現進程間通信的一種機制。它是網絡編程中的重要概念&#xff0c;通過它可以在不同的計算機之間進行數據傳輸和通信。Socket 可以用于實現各種網絡應用&#xff0c;包括客戶端-服務器模型、P2P 應用等。基本上&#xff0c;Sock…

自動駕駛決策規劃算法——二次規劃

自動駕駛決策規劃算法第二章第二節(中) 參考線算法_嗶哩嗶哩_bilibili 動態規劃開辟的凸空間如下&#xff0c;兩條橙色線之間&#xff1a; 黃色的點就意味著L的上下界&#xff0c;物理意義是當軌跡ss1時&#xff0c;L的范圍應該是(Lmin1,Lmax1)之間&#xff0c;這個范圍就是開辟…

學習日記.1

今天就是配置了droidbot的環境。主要的知識來源是GitHub - xieincz/droidbot: A lightweight test input generator for Android. Similar to Monkey, but with more intelligence and cool features! 看readme&#xff0c;注意只需要platform就好&#xff0c;sdk太大不用下載…

《Ai企業知識庫》-模型實踐-rasa開源學習框架-基礎理論-02

rasa官網 Conversational AI Platform | Superior Customer Experiences Start Here rasa簡介&#xff1a; Rasa是一個開源的機器學習框架&#xff0c;專門用于構建自動化的文本和語音對話系統&#xff0c;即聊天機器人。它允許開發者和企業創建定制化的對話體驗&#xff0c…

ubuntu設置root開機登錄,允許root用戶ssh遠程登錄

ubuntu與centos系統不同&#xff0c;默認root開機不能登錄。 1、輸入一下命令創建root密碼&#xff0c;根據提示輸入新密碼 sudo passwd root 2、打開gdm-autologin文件&#xff0c;將auth required pam_succeed_if.so user ! root quiet_success這行注釋掉&#xff0c;這行就…

el-upload 上傳多個視頻

<el-form-item label"視頻" prop"video_url"><el-uploadclass"upload-demo"ref"uploadRef":multiple"true":on-change"handleChange":before-remove"beforeRemove":before-upload"before…

Flutter 中的 EditableText 小部件:全面指南

Flutter 中的 EditableText 小部件&#xff1a;全面指南 在Flutter中&#xff0c;EditableText是一個低級別的文本編輯組件&#xff0c;它提供了構建自定義文本編輯界面的能力。與TextField和TextFormField不同&#xff0c;EditableText提供了更多的靈活性&#xff0c;允許開發…

【LinuxC語言】鏈接文件

文章目錄 前言一、inode索引節點inode的作用為什么inode重要 二、文件鏈接的定義文件鏈接是什么硬鏈接&#xff08;Hard Link&#xff09;軟鏈接&#xff08;符號鏈接&#xff0c;Symbolic Link&#xff09;硬鏈接圖示&#xff1a;軟鏈接圖示&#xff1a; 硬鏈接應用場景限制和…

五步定位性能瓶頸

一、著手測試前的準備&#xff1a;優化數據流向與系統架構分析 在進行性能測試或系統優化之前&#xff0c;明確數據流向和系統架構的細節是至關重要的步驟。這不僅能夠幫助識別潛在的瓶頸&#xff0c;還能確保測試用例設計的全面性與針對性。以下是關鍵步驟和方法&#xff1a;…

實現本地訪問云主機,以及在云主機搭建FTP站點

前言 云計算是一種基于互聯網的計算模式&#xff0c;通過網絡提供按需訪問的計算資源和服務。核心概念是把計算能力視作一種公共資源&#xff0c;用戶可以根據自身需求動態分配和管理這些資源。 云主機 ECS (Elastic Compute Server)是一種按需獲取的云端服務器&#xff0c;提…

142.棧和隊列:用棧實現隊列(力扣)

題目描述 代碼解決 class MyQueue { public:stack<int> stIn; // 輸入棧&#xff0c;用于push操作stack<int> stOut; // 輸出棧&#xff0c;用于pop和peek操作MyQueue() {}void push(int x) {stIn.push(x); // 將元素壓入輸入棧}int pop() {// 如果輸出棧為空&…

虛擬列表 vue-virtual-scroller 的使用

npm 詳情&#xff1a;vue-virtual-scroller - npm (npmjs.com) 這里我使用的是RecycleScroller。 App.vue <template><RecycleScrollerclass"scroller":items"items":item-size"54"v-slot"{ item }"><list-item :it…

Flask Response 對象

文章目錄 創建 Response 對象設置響應內容設置響應狀態碼設置響應頭完整的示例拓展設置響應的 cookie重定向響應發送文件作為響應 總結 Flask 是一個 Python Web 框架&#xff0c;用于快速開發 Web 應用程序。在 Flask 中&#xff0c;我們使用 Response 對象來構建 HTTP 響應。…

【論文筆記】advPattern

【論文題目】 advPattern: Physical-World Attacks on Deep Person Re-Identification via Adversarially Transformable Patterns Abstract 本文首次嘗試對深度reID實施魯棒的物理世界攻擊。提出了一種新穎的攻擊算法&#xff0c;稱為advPattern&#xff0c;用于在衣服上生成…

文本轉語音軟件-TTSMaker

一、TTSMaker介紹 TTSMaker&#xff08;馬克配音&#xff09;是一款免費的文本轉語音工具&#xff0c;提供語音合成服務&#xff0c;支持多種語言&#xff0c;包括中文、英語、日語、韓語、法語、德語、西班牙語、阿拉伯語等50多種語言&#xff0c;以及超過300種語音風格。 可…

C語言指針相關知識(第四篇章)(非常詳細版)

文章目錄 前言一、什么是回調函數二、qsort函數的介紹(默認升序排序)三、qsort函數的模擬實現&#xff08;通過冒泡排序&#xff09;總結 前言 本文介紹了回調函數&#xff0c;qsort函數的使用&#xff0c;以用冒泡排序來模擬實現qsort函數 提示&#xff1a;以下是本篇文章正文…