leetcode131 分割回文串

2021-10-05 11:49:59 字數 1733 閱讀 1209

給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。

返回 s 所有可能的分割方案。

示例:

輸入:

"aab"

輸出:[

["aa"

,"b"],

["a"

,"a"

,"b"

]]

本題需要先求得所有的分割方式(例如aab–>『a』 『a』 『b』 || 『aa』 『b』 || 『a』 『ab』 || 『aab』),然後判斷當前分割方式下,每一部分是否都是回文子串。

所有分割方式這一步不能被省略,因此考慮從判斷回文子串方面入手。

對於乙個字串s,我們想要知道這個字串在任意i~j範圍是否是回文子串。建立乙個2d的dp陣列,dp[i][j]表示s[i]~s[j]是否是回文串。

對於任意位置(i, j),s[i] ~ s[j] 如果是回文串,必須滿足的是s[i] == s[j], 並且s[i + 1] ~ s[j - 1]這一段是回文串。因此能夠得到狀態轉移方程。

dp陣列的求解**如下:

void

getdparray

(vectorbool

>>

& dp, string & s)}}

}

求完dp陣列後,我們從s的left位置開始遍歷,如果s[left]~s[i]位置是回文子串(通過dp陣列查詢判斷),則將這一子串加入快取陣列tmp中,然後從i位置繼續向後遍歷判斷。

**如下:

void

dfs(vector>

& res, string & s, vectorbool

>>

& dp, vector

& tmp,

int left)

// 從left開始,如果s[left]~s[i]是回文子串,則從i+1位置向後繼續分割

for(

int i = left; i < s.

size()

;++i)

}}

完整**如下:

class

solution

; vectorbool

>>

dp(s.

size()

, vector<

bool

>

(s.size()

,false))

;getdparray

(dp, s)

; vector> res;

vector tmp;

dfs(res, s, dp, tmp,0)

;return res;

}void

dfs(vector>

& res, string & s, vectorbool

>>

& dp, vector

& tmp,

int left)

for(

int i = left; i < s.

size()

;++i)}}

void

getdparray

(vectorbool

>>

& dp, string & s)}}

}};

Leetcode131 分割回文串

給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回 s 所有可能的分割方案。示例 輸入 aab 輸出 aa b a a b public list partition string s partition s,0 new arraylist res return res index...

LeetCode 131 分割回文串

給定乙個字串 s,將 s 分割成一些子串,使每個子串都是回文串。返回 s 所有可能的分割方案。示例 輸入 aab 輸出 aa b a a b 思路 回溯法 注意回溯的位置 class solution object def partition self,s type s str rtype list...

LeetCode 131 分割回文串

返回 s 所有可能的分割方案。分析 首先要用動態規劃來標記出回文子串的位置,dp i j true表示字串i到j是回文。因此動態規劃判斷時候是用的 dp i j s i s j len 3 dp i 1 j 1 表示當len 3時候只需要判斷兩個端點,其他時候還要判斷中間是否是回文子串。然後使用回溯...