131. 分割回文串

题目:
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。

一开始的思路跟题解第二种方法很像:记录出每个区间是否回文+DFS
但是在实现的时候有一个细节没想好:

		for i in range(n):
			for j in range(0, i+1):
				if i == j:
					p[j][i] = True
					continue
				if s[i] == s[j]:
					if i - j <= 2 or p[j+1][i-1]:
						p[j][i] = True

这其中的第二个for循环,我一开始写的是for j in range(i, n)
看了题解以后才想到用DP
随后自己写的解答如下:

#!/usr/bin/env python3.6
# _*_coding:utf-8 _*_
# @Time   : 2019/10/24 21:21
# @Author : Grey


class Solution:
	def partition(self, s: str):
		n = len(s)
		if n <= 1:
			return [s]
		p = [[False for _ in range(n)] for _ in range(n)]

		for i in range(n):
			for j in range(0, i+1):
				if i == j:
					p[j][i] = True
					continue
				if s[i] == s[j]:
					if i - j <= 2 or p[j+1][i-1]:
						p[j][i] = True

		res = []
		def dfs(x, tmp):
			if x == len(s):
				res.append(tmp.copy())
				return
			for i in range(x, len(s)):
				if p[x][i]:
					tmp.append(s[x:i+1])
					dfs(i+1, tmp)
					tmp.pop()
				else:
					continue
			return
		dfs(0, [])
		return res

if __name__ == '__main__':
	s = "abbccddcc"
	print(Solution.partition("self", s))

另外一种方法是直接用回溯法,在回溯过程中再判断是否回文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值