最長回文子串 三種DP實現

2021-09-28 21:04:07 字數 1580 閱讀 3838

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

示例 1:

輸入:

"babad"

輸出:"bab"

注意:"aba" 也是乙個有效答案。

示例 2:

輸入:

"cbbd"

輸出:"bb"

用動態規劃來做,列舉了三種解法

t: 156 ms m: 14.8 mb

class solution 

else

}for

(int j =

3; j <= s.

size()

;++j)

}else map[i]

[j]=0;

}}return s.

substr

(start, total);}

};

在解法一的基礎上做了改進,目的是降低空間需求。

其實很明顯,奇數長度的回文串和偶數長度的回文串之間是沒有直接關聯的。也就是,已知回文串,兩邊同時擴張乙個位置才可能有依據判斷是否為回文串。這樣的性質將回文串明顯的分為奇偶兩種可能。

class solution 

else

}for

(int j =

3; j <= s.

size()

;++j)

}else map[i]

[j%2]=

0;}}

return s.

substr

(start, total);}

};

將解法二再改進為只需要一維的陣列。

明顯,我們可以先做偶數長度的計算,之後,再算奇數的時候,只需要把原來的非0部分或者是更大的部分覆蓋掉就好了。

此外,這裡還使用動態分配記憶體的方式。由於每次呼叫該函式時都不需要分配這麼多的記憶體,需要的時間就會更短。

但同時對於動態分配記憶體,對於記憶體的儲存和釋放會需要更多的空間,因此空間上反而沒有更緩和。

class solution 

else

}for

(int j =

4; j <= s.

size()

; j+=2

)}else map[i]=0

;}}for

(int i =

0; i < s.

size()

;++i)if(

!map[i]

) map[i]=1

;for

(int j =

3; j <= s.

size()

; j+=2

)}else map[i]=0

;}}

delete[

]map;

return s.

substr

(start, total);}

};

DP 最長回文子串

dp問題,最長回文子串 最長回文子串問題指的是在乙個字串中,是回文子串的長度的最大值.這裡的回文子串是連續的.如字串 patzjujztaccbcc 他的最長回文子串是 atzjujzta 長度為9,當然它還有其他回文子串如 ccbcc 但是長度不夠長.這類問題似乎有多種解法,複雜度從o n 3 到...

最長回文子串DP

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 分析 dpdp j i 表示從j到i的子串 若dp j i 為回文串,則dp j 1 i 1 必然回文,...

最長回文子串 dp

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 題目位址 回文的主要要求是 字串從中心對稱。例如 aba bb c 假設 對於乙個 字串 a?a 假定...