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

js动态规划

动态规划(英语:Dynamic programming,简称 DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,把原问题分解为相对简单的子问题

动态规划常常适用于有重叠子问题和最优子结构性质的问题,并且记录所有子问题的结果,因此动态规划方法所耗时间往往远少于朴素解法。

动态规划有自底向上和自顶向下两种解决问题的方式。自顶向下即记忆化递归,自底向上就是递推。

使用动态规划解决的问题有个明显的特点,一旦一个子问题的求解得到结果,以后的计算过程就不会修改它,这样的特点叫做无后效性,求解问题的过程形成了一张有向无环图。动态规划只解决每个子问题一次,具有天然剪枝的功能,从而减少计算量。

1.给一个字符串 s,找到 s 中最长的 回文子串。

中心扩展法 

function longestPalindrome(s) {  if (s.length < 2) return s;  let start = 0, maxLength = 1;    // 辅助函数,用于通过中心向两边扩展检查回文  const expandAroundCenter = (left, right) => {  while (left >= 0 && right < s.length && s[left] === s[right]) {  // 更新最长回文的边界  if (right - left + 1 > maxLength) {  start = left;  maxLength = right - left + 1;  }  // 向两边扩展  left--;  right++;  }  };  // 遍历字符串的每一个字符作为中心  for (let i = 0; i < s.length - 1; i++) {  // 奇数长度的回文  expandAroundCenter(i, i);  // 偶数长度的回文  expandAroundCenter(i, i + 1);  }  return s.substring(start, start + maxLength);  
}  console.log(longestPalindrome("babad"));  // 输出: "bab"  
console.log(longestPalindrome("cbbd"));   // 输出: "bb"

 动态规划法

function longestPalindrome(s) {  if (s.length < 2) return s;  let start = 0, maxLength = 1;  const n = s.length;  // 初始化dp数组,长度为n的字符串需要n*n的二维数组  const dp = Array.from({ length: n }, () => Array(n).fill(false));    // 所有长度为1的子串都是回文  for (let i = 0; i < n; i++) {  dp[i][i] = true;  }   // s.length = 2  for (let i = 0; i < n - 1; i++) {  if (s[i] === s[i + 1]) {  dp[i][i + 1] = true;  start = i;  maxLength = 2;  }  }    // s.length > 2 for (let len = 3; len <= n; len++) {  for (let i = 0; i <= n - len; i++) {  const j = i + len - 1;  if (s[i] === s[j] && dp[i + 1][j - 1]) {  dp[i][j] = true;  start = i;  maxLength = len;  }  }  }  return s.substring(start, start + maxLength);  
}  

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【HarmonyOS】HarmonyOS NEXT学习日记:三、初识ArkUI
  • 智慧新零售移动端收银视频介绍
  • 204、【动态规划】牛客网 ——DP3 跳台阶扩展问题(Python版本)
  • Java后端开发(十五)-- Ubuntu 开启activemq开机自启动功能
  • 如何解决Windows系统目录权限问题
  • Python中Selenium 和 keyboard 库的使用
  • Transformer-Bert---散装知识点---mlm,nsp
  • 你有多自律就有多自由
  • Perl语言入门学习指南
  • 跟代码执行流程,读Megatron源码(二)训练入口pretrain_gpt.py
  • Sql Server缓冲池、连接池等基本知识(附Demo)
  • Docker 基本管理
  • 【漏洞复现】泛微E-Cology WorkflowServiceXml SQL注入漏洞
  • 探索NVM:让Node.js开发如虎添翼的利器
  • 如何检查我的网站是否支持HTTPS
  • JS 中的深拷贝与浅拷贝
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Android系统模拟器绘制实现概述
  • CentOS 7 修改主机名
  • create-react-app项目添加less配置
  • CSS实用技巧干货
  • Go 语言编译器的 //go: 详解
  • HTTP那些事
  • JavaScript 基础知识 - 入门篇(一)
  • nginx 负载服务器优化
  • Swift 中的尾递归和蹦床
  • vue-loader 源码解析系列之 selector
  • Web标准制定过程
  • windows下如何用phpstorm同步测试服务器
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 算法-插入排序
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 小程序 setData 学问多
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 用Python写一份独特的元宵节祝福
  • 在weex里面使用chart图表
  • 责任链模式的两种实现
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Redis 实现计数器和限速器的
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #git 撤消对文件的更改
  • #NOIP 2014#Day.2 T3 解方程
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (+4)2.2UML建模图
  • (152)时序收敛--->(02)时序收敛二
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (4)事件处理——(7)简单事件(Simple events)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (NSDate) 时间 (time )比较