给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]
思路:列出所有可能的分割方案,想到的是深度优先搜索,回溯算法, 22-括号生成,生成所有可能出现的括号
回溯算法
对于回溯法来说,必须齐备的三要素:
1、选择。在这个例子中,解就是一个合法的括号组合形式,而选择无非是放入左括号,还是放入右括号
2、条件。在这个例子中,选择是放入左括号,还是放入右括号,是有条件约束的,不是随便放的。而这个约束就是括号的数量。只有剩下的右括号比左括号多,才能放右括号。只有左括号数量大于0才能放入左括号。这里if的顺序会影响输出的顺序,但是不影响最终解;
3、结束。这里的结束条件很显然就是,左右括号都放完了。
对于这道题来说
1,选择的是下一个元素,
2.条件是每个子串都是回文串,
3.结束是所有字符都遍历完了
python实现
class Solution:
def partition(self, s: str) -> List[List[str]]:
res = []
self.dfs(s, [], res)
return res
def dfs(self, s, lis, res):
if not s: # 如果这一次的遍历完了,就把path放入res中,这是一个结束条件!
res.append(lis)
return
for i in range(1, len(s)+1):
if self.isPal(s[:i]): #如果是回文数,添加到path中,这是条件!
self.dfs(s[i:], lis+[s[:i]], res) #选择之后的元素!
def isPal(self, s):
return s == s[::-1]