leetcode_132. 分割回文串 II

举报
悲恋花丶无心之人 发表于 2021/03/10 00:57:40 2021/03/10
【摘要】 目录 一、题目内容 二、解题思路 三、代码 一、题目内容 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。 返回符合要求的 最少分割次数 。 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。 示例 2: 输入:s =...

目录

一、题目内容

二、解题思路

三、代码


一、题目内容

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

返回符合要求的 最少分割次数 。

示例 1:

输入:s = "aab"
输出:1
解释:只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。

示例 2:

输入:s = "a"
输出:0

示例 3:

输入:s = "ab"
输出:1

提示:

1 <= s.length <= 2000
s 仅由小写英文字母组成

二、解题思路

假设每个字符间都需要分割得到单一字符形式的回文,那么分割的次数逐次递增;

假设i从1到s的长度,而j在[0, i)之间,实际上就是找区间[j,i)间的字符串是否为回文;

如果是,那么i位置记录的切割次数就是原始i位置记录的切割次数与j位置记录的切割次数加1;

例如aab,memory里的变化如下:

[-1, 0, 1, 2]

[-1, 0, 0, 2]

[-1, 0, 0, 1]

因为aa之间不需要切割了,所以第二a的位置记录的切割次数本来是1,但是就变为0了,aa是回文;

所以到b这个位置,最小切割次数不是2而是1(第二个a的0加1);

三、代码


  
  1. class Solution:
  2. def minCut(self, s: str) -> int:
  3. if not s:
  4. return 0
  5. memory = [i for i in range(-1, len(s))]
  6. for i in range(1, len(s) + 1): # i从1开始
  7. for j in range(i): # 区间[j, i)
  8. if s[j:i] == s[j:i][::-1]:
  9. memory[i] = min(memory[i], memory[j] + 1)
  10. return memory[-1]
  11. if __name__ == "__main__":
  12. ss = Solution()
  13. s = "aaa"
  14. ans = ss.minCut(s)
  15. print(ans)

文章来源: nickhuang1996.blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。

原文链接:nickhuang1996.blog.csdn.net/article/details/114522523

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。