日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode 5. 最长回文子串(Longest Palindromic Substring)

發布時間:2023/11/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode 5. 最长回文子串(Longest Palindromic Substring) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

推薦理由:暴力解法太 naive,中心擴散不普適,Manacher 就更不普適了,是專門解這個問題的方法。而用動態規劃我認為是最有用的,可以幫助你舉一反三的方法。

補充說明:Manacher 算法有興趣的朋友們可以了解一下,有人就借助它的第一步字符串預處理思想,解決了 LeetCode 第 4 題。因此以上推薦僅代表個人觀點。

解決這類 “最優子結構” 問題,可以考慮使用 “動態規劃”:

1、定義 “狀態”;
2、找到 “狀態轉移方程”。

記號說明: 下文中,使用記號 s[l, r] 表示原始字符串的一個子串,l、r 分別是區間的左右邊界的索引值,使用左閉、右閉區間表示左右邊界可以取到。舉個例子,當 s = 'babad' 時,s[0, 1] = 'ba' ,s[2, 4] = 'bad'。

1、定義 “狀態”,這里 “狀態”數組是二維數組。

dp[l][r] 表示子串 s[l, r](包括區間左右端點)是否構成回文串,是一個二維布爾型數組。即如果子串 s[l, r] 是回文串,那么 dp[l][r] = true。

2、找到 “狀態轉移方程”。

首先,我們很清楚一個事實:

1、當子串只包含 11 個字符,它一定是回文子串;

2、當子串包含 2 個以上字符的時候:如果 s[l, r] 是一個回文串,例如 “abccba”,那么這個回文串兩邊各往里面收縮一個字符(如果可以的話)的子串 s[l + 1, r - 1] 也一定是回文串,即:如果 dp[l][r] == true 成立,一定有 dp[l + 1][r - 1] = true 成立。

根據這一點,我們可以知道,給出一個子串 s[l, r] ,如果 s[l] != s[r],那么這個子串就一定不是回文串。如果 s[l] == s[r] 成立,就接著判斷 s[l + 1] 與 s[r - 1],這很像中心擴散法的逆方法。

事實上,當 s[l] == s[r] 成立的時候,dp[l][r] 的值由 dp[l + 1][r - l] 決定,這一點也不難思考:當左右邊界字符串相等的時候,整個字符串是否是回文就完全由“原字符串去掉左右邊界”的子串是否回文決定。但是這里還需要再多考慮一點點:“原字符串去掉左右邊界”的子串的邊界情況。

1、當原字符串的元素個數為 33 個的時候,如果左右邊界相等,那么去掉它們以后,只剩下 11 個字符,它一定是回文串,故原字符串也一定是回文串;

2、當原字符串的元素個數為 22 個的時候,如果左右邊界相等,那么去掉它們以后,只剩下 00 個字符,顯然原字符串也一定是回文串。

把上面兩點歸納一下,只要 s[l + 1, r - 1] 至少包含兩個元素,就有必要繼續做判斷,否則直接根據左右邊界是否相等就能得到原字符串的回文性。而“s[l + 1, r - 1] 至少包含兩個元素”等價于 l + 1 < r - 1,整理得 l - r < -2,或者 r - l > 2。

綜上,如果一個字符串的左右邊界相等,以下二者之一成立即可:
1、去掉左右邊界以后的字符串不構成區間,即“ s[l + 1, r - 1] 至少包含兩個元素”的反面,即 l - r >= -2,或者 r - l <= 2;
2、去掉左右邊界以后的字符串是回文串,具體說,它的回文性決定了原字符串的回文性。

于是整理成“狀態轉移方程”:

dp[l, r] = (s[l] == s[r] and (l - r >= -2 or dp[l + 1, r - 1]))
或者

dp[l, r] = (s[l] == s[r] and (r - l <= 2 or dp[l + 1, r - 1]))
編碼實現細節:因為要構成子串 l 一定小于等于 r ,我們只關心 “狀態”數組“上三角”的那部分取值。理解上面的“狀態轉移方程”中的 (r - l <= 2 or dp[l + 1, r - 1]) 這部分是關鍵,因為 or 是短路運算,因此,如果收縮以后不構成區間,那么就沒有必要看繼續 dp[l + 1, r - 1] 的取值。

讀者可以思考一下:為什么在動態規劃的算法中,不用考慮回文串長度的奇偶性呢。想一想,答案就在狀態轉移方程里面。

具體編碼細節在代碼的注釋中已經體現。

?

class Solution { public:string longestPalindrome(string s) {if (s.size() < 2) return s;int n = s.size(), maxLen = 0, start = 0;for (int i = 0; i < n - 1; ++i) {searchPalindrome(s, i, i, start, maxLen);searchPalindrome(s, i, i + 1, start, maxLen);}return s.substr(start, maxLen);}void searchPalindrome(string s, int left, int right, int& start, int& maxLen) {while (left >= 0 && right < s.size() && s[left] == s[right]) {--left; ++right;}if (maxLen < right - left - 1) {start = left + 1;maxLen = right - left - 1;}} };

?

總結

以上是生活随笔為你收集整理的Leetcode 5. 最长回文子串(Longest Palindromic Substring)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 桃花岛影院| 手机看片日韩在线 | 国产成人在线一区 | 久久两性视频 | 免费看黄色漫画 | 黄色操人视频 | 国家队动漫免费观看在线观看晨光 | 欧美高清hd | 在线观看视频毛片 | 美女视频一区二区 | 国产精品美女av | 精品少妇久久久久久888优播 | 成人小视频在线 | 久久久久久久久久综合 | 污网在线看 | 久精品免费视频 | 风韵少妇性饥渴推油按摩视频 | av在线免费播放网站 | www.色午夜 | 日韩插 | 天堂√| 老熟女毛茸茸 | 青青色在线 | 8mav在线| 韩国av免费在线观看 | 神秘马戏团在线观看免费高清中文 | 插插综合视频 | 在线看片你懂 | 少妇福利视频 | 午夜男人天堂 | 大奶骚 | 人妻少妇偷人精品久久性色 | 国产中文字幕一区二区 | 国产美女在线看 | 色眯眯av| 四虎影院一区 | 中文字幕人乱码中文字 | mm视频在线观看 | 日韩激情综合网 | 91精品综合久久久久久五月天 | 亚洲m码 欧洲s码sss222 | 中国极品少妇xxxx | www,99 | 一本色道久久88综合日韩精品 | 永久免费在线 | 天堂999| 可以看污的网站 | 特级淫片裸体免费看 | 亚洲xxxxx| 光溜溜视频素材大全美女 | 国产亚洲精品久久久久丝瓜 | 97av超碰 | 打开每日更新在线观看 | 日韩欧美精品一区 | 黄色正能量网站 | 做爰无遮挡三级 | 在线观看日韩中文字幕 | 日韩最新中文字幕 | 成年人观看视频 | a级在线观看网站 | 自偷自拍亚洲 | 国产午夜福利在线播放 | 99国产精品99久久久久久粉嫩 | 中文字幕在线观看第一页 | 日韩专区第一页 | 日日日干干干 | 日本55丰满熟妇厨房伦 | 国产午夜精品一区二区三区欧美 | 免费成人毛片 | 欧美福利网 | 日韩激情图片 | 撸啊撸在线视频 | 夜夜嗨av一区二区三区免费区 | 国产精选一区二区 | 国产手机在线播放 | 黄在线免费看 | 成人福利视频网 | 国产精品人妻一区二区三区 | 国产在线拍揄自揄拍 | 肥熟女一区二区三肥熟女 | 午夜黄视频 | a色网站| 中文字幕啪啪 | 免费视频福利 | 免费中文字幕视频 | 中文字幕一二 | 欧美日韩999 | 免费一级a毛片夜夜看 | 中文字幕人乱码中文字 | 亚洲狠狠爱 | 求个黄色网址 | 成人网在线视频 | 久久久久久久麻豆 | 欧美怡红院视频一区二区三区 | 又色又爽又高潮免费视频国产 | 免费中文字幕 | 免费爱爱视频 | 天堂综合网 | 丰满大乳奶做爰ⅹxx视频 |