給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
示例 1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是乙個有效答案。
示例 2:
輸入: "cbbd"
輸出: "bb"
暴力求解
把每個長度大於二的子串都進行驗證,然後取最大,時間複雜度o(n3),然後就愉快的超時0.0
class solution
return true;
}string longestpalindrome(string s) }}
return str;
}};
動態規劃
動態規劃關鍵步驟狀態轉移:
乙個回文去掉兩頭以後,剩下的部分依然是回文;
如果乙個字串的頭尾兩個字元都不相等,那麼這個字串一定不是回文串;
如果乙個字串的頭尾兩個字元相等,才有必要繼續判斷下去。
如果裡面的子串是回文,整體就是回文串;
如果裡面的子串不是回文串,整體就不是回文串。
定義dp[i][j]表示s[i....j]是否為回文串(左閉右閉),根據「如果裡面的子串判斷是否回文」,可以得到轉移方程:dp[i][j] = (s[i] == s[j]) && dp[i + 1][j - 1] == true
然後考慮一下邊界問題:
s[i + 1......j - 1],成立的條件為長度小於2,即j - 1 - (i + 1) < 2,即j - i < 3.
j - i < 3 等價於 j - i + 1 < 4,即當子串 s[i..j] 的長度等於 2 或者等於 3 的時候,其實只需要判斷一下頭尾兩個字元是否相等就可以直接下結論了。
如果子串 s[i + 1..j - 1] 只有 1 個字元,即去掉兩頭,剩下中間部分只有 1 個字元,顯然是回文;
如果子串 s[i + 1..j - 1] 為空串,那麼子串 s[i, j] 一定是回文子串。
因此,在 s[i] == s[j] 成立和 j - i < 3 的前提下,直接可以下結論,dp[i][j] = true,否則才執行狀態轉移。
class solution
for (int j = 1; j < len; j++)
else
else
}if (dp[i][j] && j - i + 1 > max) }}
string str = "";
for (int i = begin; i < begin + max; i++)
return str;
}};
思路參考:liweiwei1419 動態規劃 最長回文子串
動態規劃 最長回文子串 題目描述 給出乙個字串s,求s的最長回文子串的長度 樣例 字串 patzjujztaccbcc 的最長回文子串為 atzjujzta 長度為9。動態規劃思想 令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不是為0。這樣根據s i 是否等於s j ...
動態規劃 最長回文子串
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 本題有很多種解法,最簡單的暴力求解,但是會超時。下面分別說明動態規劃法和中心擴散法。解法一 動態規劃法...
最長回文子串 動態規劃
給出乙個字串s,求s的最長回文子串的長度。樣例輸入 patzjujztaccbcc 輸出 9 尋找二維動態規劃表示式dp i j 如果直接用dp i j 表示子符串從s i 到s j 的最長回文子串長度無法得出遞推表示式。令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不...