【Hello Algorithm】暴力递归到动态规划(三)(中)

简介: 【Hello Algorithm】暴力递归到动态规划(三)(中)

最长回文串子序列

方法一

做这道题目我们其实可以复用下上面的最长公共子序列的代码来做

我们可以将字符串逆序一下创造出一个新的字符串

再找出这两个字符串的最长公共子序列 我们找出来的最长公共子序列就是回文子序列 (其实我们可以想想两个指针从一个字符串的两端开始查找)

方法二

递归版本

我们写的递归函数如下

int process(string& str , int L , int R)

它的含义是 我们给定一个字符串str 返回给这个字符串从L到R位置上的最大回文子串

参数含义如下

  • str 我们需要知道回文子串长度的字符串
  • L 我们需要知道回文子串长度的起始位置
  • R 我们需要知道回文子串长度的终止位置

所有的递归函数都一样 我们首先来想base case

这道题目中变化的参数其实就只有L 和 R 所以说我们只需要考虑L和R的base case

如果L和R相等 如果L和R只相差1

  if (L == R)    
  {              
    return 1;    
  }              
  if (L == R - 1)    
  {                  
    return str[L] == str[R] ? 2 : 1;    
  }      

之后我们来考虑下普遍的可能性

  • 如果L 和 R就是回文子序列的一部分
  • 如果L可能是回文子序列的一部分 R不是
  • 如果L不是回文子序列的一部分 R有可能是

我们按照上面的可能性分析写出下面的代码 之后返回最大值即可

  int p1 = process(str , L + 1 , R);    
  int p2 = process(str , L , R - 1);
  int p3 = str[L] == str[R] ? 2 + process(str , L + 1, R - 1) : 0;                                                              
  return max(max(p1 , p2) , p3);

动态规划

我们注意到原递归函数中 可变参数只有L 和 R 所以说我们只需要围绕着L 和 R建立一张二维表就可以

当然 在一般情况下 L是一定小于等于R的 所以说L大于R的区域我们不考虑

我们首先来看base case

  if (L == R)    
  {              
    return 1;    
  }              
  if (L == R - 1)    
  {                  
    return str[L] == str[R] ? 2 : 1;    
  }   

围绕着这个base case 我们就可以填写两个对角线的内容

    for (int L = 0; L < str.size(); L++)
    {
      for(int R = L; R < str.size(); R++)
      {
        if (L == R)
        {
          dp[L][R] = 0;
        }
        if (L == R-1)
        {
          dp[L][R-1] = str[L] == str[R] ? 2 : 1;
        }
      }                                                                                                                         
    }

接下来我们看一个格子普遍依赖哪些格子

  int p1 = process(str , L + 1 , R);    
  int p2 = process(str , L , R - 1);
  int p3 = str[L] == str[R] ? 2 + process(str , L + 1, R - 1) : 0;          

从上面的代码我们可以看到 分别依赖于

L+1 R  
L , R-1
L+1 , R-1

从图上来分析 黑色的格子依赖于三个红色格子

a583e305419d4412933d9601e740bb2a.png

于是我们就可以沿着对角线来不断的填写数字

横行一直从0开始 纵列一直在变化 所以我们用列来遍历

最后返回dp[0][str.size()-1]即可

  int process1(string& str ,  vector<vector<int>>& dp)
  {
    for (int L = 0; L < str.size(); L++)
    {
     for(int R = 0; R < str.size(); R++)
      {
        if (L == R)
        {
          dp[L][R] = 1;
        }
        if (L == R-1)
        {
          dp[L][R] = str[L] == str[R] ? 2 : 1;
        }
      }
    }                                             
    for (int startR = 2; startR < str.size(); startR++)
    {
      int L = 0;
      int R = startR;
      while (R < str.size())
      {
        int p1 = dp[L+1][R];
        int p2 = dp[L][R-1];
        int p3 = str[L] == str[R] ? 2 + dp[L+1][R-1] : 0;
        dp[L][R] = max(p1 , max(p2 , p3));
        L++;
        R++;
      }
    }
    return dp[0][str.size()-1];
  }


目录
打赏
0
0
0
0
46
分享
相关文章
阿里云免费HTTPS证书申请入口及申请流程
阿里云免费HTTPS证书申请入口及申请流程,阿里云SSL免费证书在哪申请?一个阿里云账号一年可以申请20张免费SSL证书,很多同学找不到免费SSL的入口,阿小云来详细说下阿里云SSL证书免费申请入口链接以及免费SSL证书申请流程,有同学反馈阿里云免费SSL证书没有了?错,一直都有啊,阿里云一直都有免费SSL提供,只是隐藏得比较深:
2977 0
OFDM——PAPR减小(三)
OFDM——PAPR减小(三)
206 0
什么是Python中的内存池(Memory Pool)?
什么是Python中的内存池(Memory Pool)?
164 0
video-subtitle-master:开源字幕生成神器!批量生成+AI翻译全自动,5分钟解放双手
video-subtitle-master 是一款开源AI字幕生成工具,支持批量为视频或音频生成字幕,并可将字幕翻译成多种语言。它集成了多种翻译服务和语音识别技术,适合视频创作者、教育领域和个人娱乐使用。
412 0
video-subtitle-master:开源字幕生成神器!批量生成+AI翻译全自动,5分钟解放双手
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
【通义】AI视界|AI的胜利!蛋白质结构预测获诺贝尔化学奖
本文介绍了最新的人工智能动态,包括OpenAI计划在新加坡设立新办事处以加速亚太布局、蛋白质结构预测获得诺贝尔化学奖、OpenAI请求法院驳回马斯克的诉讼、Meta的人工智能聊天机器人将在21个新地区推出,以及亚马逊推出的“视觉辅助包裹检索”技术。这些进展展示了人工智能领域的快速发展及其在各行业的广泛应用。点击[通义官网]了解更多功能。
如何构建高效的自动化测试框架:策略与实践
【7月更文挑战第6天】构建高效的自动化测试框架是一个持续的过程,需要不断迭代和优化。通过遵循设计原则、选择合适的关键技术、并遵循科学的实施步骤,我们可以构建出稳定、可靠、易于维护的自动化测试框架,为软件质量的提升和交付周期的缩短提供有力支持。
DataWorks产品使用合集之如何部署自己写的Python算法
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
129 5
多模态产品在智能文档处理应用的展望------以TextIn模型为例
**第十四届VALSE大会在重庆举行,合合信息智能创新事业部研发总监常扬分享了“文档解析与向量化技术”,重点介绍TextIn技术。TextIn解决现有文档解析挑战,如表格解析难题,建立包含数据基建、算法、应用和接入四层架构的文档解析Pipeline。关键技术包括版面分析和文档树引擎,能准确识别文档结构和阅读顺序。TextIn在C-MTEB榜单排名第一,显示其在文本向量化领域的优势,适用于长文档处理和多行业应用,有望推动AI技术进步和产业升级。**
305 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等