2021 1 13 刷題(最長回文字串 動規)

2022-06-11 12:42:13 字數 1248 閱讀 9987

題目描述:

給你乙個字串 s,找到 s 中最長的回文子串。

示例 1:

輸入:s = "babad"

輸出:"bab"

解釋:"aba" 同樣是符合題意的答案。

示例 2:

輸入:s = "cbbd"

輸出:"bb"

示例 3:

輸入:s = "a"

輸出:"a"

示例 4:

輸入:s = "ac"

輸出:"a"

方法一:暴力求解

class solution      

}else break;

}temp = "";

}return res;}};

本題使用的方法是動態規劃,這裡需要找的是最長回文子串,首先第一步,我們需要定義dp陣列的含義,定義二維布林陣列dp[i][j]dp[i][j]陣列表示:

字串s[i\cdots j]s[i⋯j]是否為回文子串,如果是,dp[i][j] = true,如果不是,dp[i][j] = false。

如何我們現在已經知道了dp[i+1][j-1]了,那我們如何計算dp[i][j]呢?通過觀察,我們發現:

如果s[i] == s[j]那麼說明只要dp[i+1][j-1]是回文子串,那麼是dp[i][j]也就是回文子串

如果s[i]不等於s[j]那麼說明dp[i][j]dp[i][j]必定不是回文子串。

當只有乙個字母的時候肯定是回文子串,所以初始化的dp表應該如下圖所示:

但是這樣會有一種情況通過不了例如給的例子中的「cbbd」:

由於我們在dp表中表示不出來,那我們就在計算的時候單獨拿出來這種情況計算,即i和j相鄰的時候。

class solution 

}for(int l=3;l<=len;l++)//l表示檢索的子串長度,等於3表示先檢索長度為3的子串}}

return s.substr(start,max);//獲取最長回文子串}};

刷題48 最長回文串

給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如 aa 不能當做乙個回文字串。注意 假設字串的長度不會超過 1010。輸入 abccccdd 輸出 7 解釋 我們可以構造的最長的回文串是 dccaccd 它的長度是 7。charcode...

leetcode刷題 最長回文子串

看了一下題解,還有很多種方法,比如動態規劃,但是看了乙個下午也沒看太懂。所以就先把暴力破解弄懂吧。我這個菜雞,還要多多努力啊。主要問題在,不知道怎麼列舉字串的所有子串,題解中使用的是雙指標辦法,固定左指標,右指標移動得到全部的子串。最後,進行回文字串的驗證時,也是採用的雙指標方法來進行驗證。因此雙指...

最長回文字串

scanf s 輸入字串碰到空格或者tab就會停下來。此處可以使用fgets或者gets 另外注意標頭檔案cctype中的函式的巧妙使用,此處使用isalpha和toupper簡化了 此處列舉字串的中間位置,然後向倆邊擴充套件,節省了時間複雜度,注意向倆邊擴充套件時,奇數個和偶數個長度的區別。另外程...