LeetCode:分割回文串(Python版本)

LeetCode刷题日记

  • 分割回文串
    • Python代码
      • 代码分析

分割回文串

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。

返回 s 所有可能的分割方案。

示例:

输入: “aab”
输出:
[
[“aa”,“b”],
[“a”,“a”,“b”]
]

Python代码

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 可取,123
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可取12
	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的变化,一层一层退就好了。

作为一个初学者,看懂这段代码真的挺吃力的,现在拿出来分析过程,希望学习的人能省点力。

你可能感兴趣的:(Python)