LeetCode5 最長回文串

2021-08-20 05:49:34 字數 1473 閱讀 6956

#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 ...