来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: “aab”
输出:
[
[“aa”,“b”],
[“a”,“a”,“b”]
]
class Solution(object):
def partition(self, s):
"""
:type s: str
:rtype: List[List[str]]
"""
if len(s) == 0:
return []
else:
res = []
self.dividedAndsel(s, [], res)
return res
def dividedAndsel(self, s, tmp, res):
if len(s) == 0:
res.append(tmp)
for i in range(1, len(s)+1):
if s[:i] == s[:i][::-1]:
self.dividedAndsel(s[i:], tmp + [s[:i]], res)
此题采用了回溯+递归的思路,先将字符串分割,再留下满足题目要求的字符串。
Eg: ['a','a','b'] ==> ['a','a','b'],['a','ab'],['aa','b'],['aab']
['a','a','b'],['aa','b']
那么现在从程序输入开始分析:
s=['a','a','b'], len(s) != 0
,之后调用dividedAndsel('aab', [], [])
为了方便分析,用伪代码显示过程。
for i in range(1, len(s)+1): 此时 i = 1, len(s)+1 = 4,因此i 可取,1,2,3
s[:i] = 'a'
s[i:] = 'ab'
tmp + [s[:i]] = ['a']
第一次递归
for i in range(1, len(s)+1): 此时 i = 1, len(s)+1 = 3,因此i可取1,2
s[:i] = 'a'
s[i:] = 'b'
tmp + [s[:i]] = ['a','a']
第三次递归
for i in range(1, len(s)+1): 此时 i = 1, len(s)+1 = 2,因此i可取1
s[:i] = 'b'
s[i:] = ''
tmp + [s[:i]] = ['a','a','b']
第四次递归
for i in range(1, len(s)+1): 此时 无法进入for循环 因为len(s)+1 = 1
......
之后数i的变化,一层一层退就好了。
作为一个初学者,看懂这段代码真的挺吃力的,现在拿出来分析过程,希望学习的人能省点力。