标签:return 0132 range len II length startIndex dp 回文
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。
返回符合要求的 最少分割次数 。
示例 1:
输入:s = "aab"
输出:1
解释:只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。
示例 2:
输入:s = "a"
输出:0
示例 3:
输入:s = "ab"
输出:1
提示:
1 <= s.length <= 2000
s 仅由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-partitioning-ii
参考:
- 官方
python
# 0132.分割回文串II
class Solution:
def minCut(self, s: str) -> int:
"""
动态规划
:param s:
:return:
"""
length = len(s)
dp = [[True] * length for _ in range(length)]
for i in range(length-1, -1, -1):
for j in range(i+1, length):
dp[i][j] = (s[i]==s[j]) and dp[i+1][j-1]
f = [float("INF")] * length
for i in range(length):
if dp[0][i]:
f[i] = 0
else:
for j in range(i):
if dp[j+1][i]:
f[i] = min(f[i], f[j]+1)
return f[length-1]
def minCut_(self, s: str) -> int:
"""
参考题131, 回溯法超时间
:param s:
:return:
"""
res = []
path = []
def isPalindrome(s):
n = len(s)
i, j = 0, n - 1
while i < j:
if s[i] != s[j]: return False
i += 1
j -= 1
return True
def track(s, startIndex):
# 起始位置已经大于s的大小,说明已经找到一组分割方案
if startIndex >= len(s):
res.append(path[:])
return
for i in range(startIndex, len(s)):
# 获取[startIndex:i+1]的子串
p = s[startIndex:i + 1]
if isPalindrome(p):
path.append(p)
else:
continue
track(s, i + 1)
path.pop() # 回溯
track(s, 0)
MIN = 10000
for item in res:
length = len(item)
MIN = min(MIN, length-1)
return MIN
golang
待完善
标签:return,0132,range,len,II,length,startIndex,dp,回文 来源: https://www.cnblogs.com/davis12/p/15647419.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。