LeetCode每日一题,131. Palindrome Partitioning
先看题目描述
大意就是给定一个字符串 s,让我们将 s 划分为多个回文子串,返回所有的划分方式
算法和思路
回溯 + 动态规划预处理
我们首先使用动态规划对字符串 s 进行预处理,布尔数组 dp[i][j] 代表子串 s[i:j] 是否为回文子串
状态转移方程为 dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j]
将 dp 数组预先构建好后便可在 O(1) 的时间内判断 s 的某子串是否为回文串
由于需要求出字符串 s 的所有分割方案,因此我们考虑使用搜索 + 回溯的方法枚举所有可能的分割方案并进行判断
设当前搜索到字符串的第 i 个字符,且 s[0:i - 1] 位置的所有字符已被分割成若干个回文子串。接下来我们从 i 开始,从小到大依次枚举 j,通过 dp 数组判断 s[i:j] 是否为回文串,若为回文串,那么将其加入答案数组 temp,并以 j + 1 作为新的 i 进行下一轮搜索,并在未来的回溯时将 s[i:j] 从答案中移除
当搜索完字符串 s 的最后一个字符时,那么就找到了一种满足要求的分割方法
算法和源码
回溯 + 动态规划预处理
1 | class Solution { |
下面是自己一开始实现的方法,算法比较像是分治,虽然提交时通过了,但是效率很低,可能是由于往动态数组中存取子串的过程过于繁琐
1 | class Solution { |