当前位置: 首页 > news >正文

每日一练:分割回文串Ⅳ

1745. 分割回文串 IV - 力扣(LeetCode)

题目要求:

给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,那么返回 true ,否则返回 false 。

当一个字符串正着读和反着读是一模一样的,就称其为 回文字符串 。

示例 1:

输入:s = "abcbdd"
输出:true
解释:"abcbdd" = "a" + "bcb" + "dd",三个子字符串都是回文的。

示例 2:

输入:s = "bcbddxy"
输出:false
解释:s 没办法被分割成 3 个回文子字符串。

提示:

  • 3 <= s.length <= 2000
  • s​​​​​​ 只包含小写英文字母。

解法-1 动态规划 O(N^2):

        要分成三个回文子串,首先要把字符串分割成三个部分:

        

        只要s[j]到s[i]是回文串,并且s[0]到s[j-1]、s[i+1]到s[n-1]也是回文串,那它就可以分割成三个回文串。 

        这个题也需要创建一个二维dp表,dp[i][j]存放以s[j]为开头,以s[i]为结尾的子串是不是回文串,填表方法与每日一练:回文子串-CSDN博客一致。

        填完表后,遍历dp表,只要某个dp[i][j]符合:dp[i][j] && dp[n-1][i+1] && dp[j-1][0],那么就返回true,遍历完之后还没有返回true,说明它不能分割成三个回文子串,就返回false。

        注意,最后遍历dp表时,i、j从1开始遍历,到n-2结束,防止出现以下情况:

        

        它只分成了两端,不符合题目要求。

class Solution {
public:bool checkPartitioning(string s) {int n = s.size();vector<vector<bool>> dp(n);for(int i = 0;i < n;i++)dp[i].resize(i+1);for(int i = 0;i < n;i++){for(int j = 0;j <= i;j++){if(s[j] == s[i]){if(i == j)dp[i][j] = true;else if(j == i-1)dp[i][j] = true;elsedp[i][j] = dp[i-1][j+1];}}}for(int i = 1;i < n-1;i++){for(int j = 1;j <= i;j++){if(dp[i][j]){if(dp[n-1][i+1] && dp[j-1][0])return true;}}}return false;}
};

 


http://www.mrgr.cn/news/46411.html

相关文章:

  • 每打开一个chrome页面都会【自动打开F12开发者模式】,原因是 使用HBuilderX会影响谷歌浏览器的浏览模式
  • 【docker踩坑记录】
  • FIDO2密码钥匙与无密码认证:打造安全便捷的数字世界
  • 【面试题】技术场景 5、日志采集ELK
  • Spring MVC简单数据绑定
  • 【Block总结】掩码窗口自注意力 (M-WSA)
  • Python神仙级思维导图+入门教程(非常详细,入门从这篇开始)
  • 揭秘猫咪掉毛的真实原因有哪些?掉毛飞毛宠物空气净化器来救援!
  • 编程技巧:提高代码健壮性与可维护性的关键方法(以 Shell 为例)
  • 科研必备降重画图工具
  • 【光追模组】雷神之锤4光追mod,调色并修改光影,并且支持光追效果,游戏画质大提升
  • quic-go实现屏幕广播程序
  • 如何编写测试用例
  • AVL树
  • 详谈7麦阵列
  • 力扣hot100--链表
  • 给网站加加速!下一代CDN(EdgeOne/边缘安全加速)使用与配置体验
  • gradle降级
  • QGridLayout Class
  • 趋势追踪:深度解析“单阳不破”形态
  • C#操作SqlServer数据库语句
  • 【RAG论文精读3】RAG论文综述1(2312.10997)-第1部分
  • fiddler手机抓包
  • MySQL(八)——索引
  • java内置的四种函数式接口
  • AD原理图编译出现Net XX has no driving source