#include
#include
#include
#include
#include
#include
using
namespace
std;
#ifndef _solution_h
#define _solution_h
/**思路:
從回文串的對稱點開始,依次向左向右比較,不相同的時候停止遍歷,直到找出最大的長度的回文子串。
* (1)回文子串長度為奇數:對稱點只有乙個字元
* (2)回文子串長度為偶數:對稱點有兩個字元
時間複雜度為o(n^2):對稱點的數量為o(n),每次查詢的時間也為o(n),所有總時間複雜度為o(n^2) */
class solution
//比較,更新最長回文串
if (right - left + 1 > resultstr.size())
}//回文子串長度為偶數:對稱點有兩個字元
for (int i = 0; i < len - 1; ++i)
//比較,更新最長回文串
if (right - left + 1 > resultstr.size())}}
return resultstr;
}}; #endif
我們維護乙個二維陣列dp,其中dp[i][j]表示字串區間[i,j]是否為回文串,當i==j時,只有乙個字元,肯定是回文串,如果i=j+1,說明是相鄰字串,此時需要判斷s[j]是否等於s[j],如果i=j+1,說明是相鄰字元,此時需要判斷s[i]是否等於s[j].如果i和j不相鄰,需要除了判斷s[i]s[j]相等之外dp[j+1][i-1]若為真,就是回文串。
可以寫出如下遞推式子:
dp[i,j] = 1
if i == j
if j = i + 1& s[i] == s[j]
if j-i>=2&s[i]==s[j]&dp[j+1][i-1]==1
不斷更新索引,找出最長len.
#include
#include
#include
#include
#include
#include
using
namespace
std;
#ifndef _solution_h
#define _solution_h
// dp
class solution , left = 0, right = 0, len = 0;
for (int i = 0; i < s.size(); ++i)
}dp[i][i] = 1;
}return s.substr(left, right - left + 1);
}};#endif
時間複雜度為o(n) LeetCode 5 最長回文串
目錄 1.題目描述 2.解決方案 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 方法一 動態規劃 演算法 用二位陣列來標記字串從下標 i 到下標 j 是否為回...
Leetcode 5 最長回文串
解題思想 1.中心擴充套件法 從字串中心分別往左右兩端移動,while l 0 r易混點 回文串的起始值 i 迴圈中回文串的長度 1 2 看不懂找數帶入即可 class solution def longestpalindrome self,s str str n len s defgetlen l...
LeetCode5最長回文子串
給定乙個字串s,找到s中最長的回文子串。你可以假設s長度最長為1000。示例 輸入 babad 輸出 bab 注意 aba 也是有效答案示例 輸入 cbbd 輸出 bb 動態規劃來做,每個回文字串的子字串也是回文字串,即string是回文字串那麼它的string.substring 1,lenth ...