|
发表于 2019-12-8 23:29:27
|
显示全部楼层
思路嘛,我就选递归最表层说吧。
先不管函数自调用的那个部分,从获得的字符串中从前往后寻找切断点,把原字符串分成左右两个部分。
左边的部分是目前得到的子字符串(以下称之为 '子串' ),右边的部分是没有分割过的,是不是回文不清楚、也不重要。
如果左边子串是回文,那么递归得出右边的子串的所有分割方案(右边子串要作为输入经历函数输入字符串的流程)。
然后遍历得到的右边子串的所有方案,把当前的回文串加在所有方案的左边,如果右边子串没有方案,那么就直接把左边子串作为方案加入到所有方案中。
打个比方说:
输入:'aba'
深度
| 输入
| 左边
| 右边
| 备注
| 0 | 'aba' | 'a' | 'ba' | 左边是回文,
右边作为参数
传给自己
| 1 | 'ba' | 'b' | 'a' | 同上
| 2 | 'a' | 'a' | '' | 同上
| 3 | '' | 无
| 无
| 返回一个空列表
| 2 | 'a' | 'a' | '' | 得到[]
将['a']加入到 res 中
然后返回 res
| 1 | 'ba' | 'b' | 'a' | 得到[['a']]
将 'b' 插入所有方案的前面
并加入到res,切断点右移 | 1 | 'ba'
| 'ba'
| ''
| 左边不是回文
遍历结束,返回res
| 0 | 'aba' | 'a' | 'ba' | 得到[['b', 'a']]
将 'a' 插入所有方案的前面
并加入到res,切断点右移
此时 res 为
[['a', 'b', 'a']] | 0 | 'aba'
| 'ab'
| 'a' | 左边不是回文
切断点右移 | 0 | 'aba'
| 'aba'
| '' | 左边是回文,
右边作为参数
传给自己 | 1 | '' | 无
| 无
| 返回一个空列表 | 0 | 'aba' | 'aba' | '' | 得到[]
将['aba']加入到 res 中
然后返回 res
此时 res 为
[['a', 'b', 'a'], ['aba']]
|
就是如上流程,不懂另说
|
|