LeetCode: 131. Palindrome Partitioning
I’m come back ! 从今天开始,争取每天刷一道 LeetCode,并写一篇相应的题解。
题目描述
Given a string s
, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s
.
Example:
Input: "aab"
Output:
[["aa","b"],["a","a","b"]
]
解题思路 —— 动态规划构建回文表格, 深度优先搜索构建 palindrome partitioning
动态规划构建回文表格(bPalindromes)
利用动态规划, 将给定字符串 s
中的回文子串识别出来,具体操作如下。
1. 定义。记, bPalindromes[i][j]
为字符串 s
在区间 [i, j)
的子串为回文串的真值性。如,s = aabaa
时, bPalindromes[1][4] = true, bPalindromes[1][3] = false
。
2. 初始化。空串 bPalindromes[i][i]
和 单字符串 bPalindromes[i][i+1]
为回文串。
3. 状态转移方程。s
串在 [i, j)
区间的子串是回文串的充要条件是:s
串在 [i+1, j-1)
区间的子串是回文串, 且 s[i] == s[j-1]
。即:bPalindromes[i][j] = (bPalindromes[i+1][j-1] && s[i] == s[j-1])
。
4. 例子。 当 s = aabaa
时,
(0)s
字符串:
(1)初始化后的回文表格 bPalindromes
:
(2) 状态转移后的回文表格:
深度优先搜索构建 palindrome partitioning
根据回文表格记录的回文子串信息,深度优先搜索能拼凑出 s
串的回文子串的所有可能。
AC 代码
class Solution {
private:void ConstructPalindromesTable(vector<vector<bool>>& bPalindromes, const string& s){ bPalindromes.resize(s.size()&#43;1);for(size_t i &#61; 0; i 1; &#43;&#43;i){bPalindromes[i].resize(s.size()&#43;1, false);}for(size_t i &#61; 0; i 1] &#61; true;bPalindromes[i][i] &#61; true;}for(size_t j &#61; 1; j 1; &#43;&#43;j){for(size_t i &#61; 0; i