用动态规划解决最长子序列类型的题

动态规划

动规五部曲分析如下:

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

题一:给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

力扣链接

思路:

  • 声明一个数组db
  • 两个for循环 存储第一个for下标下的长度
/**
 * @param {number[]} nums
 * @return {number}
 */
var lengthOfLIS = function(nums) {
    let len = nums.length,db = new Array(len).fill(1);
    let result = 1;
    for(let j=1;j<len;j++){
        for(let i=0;i<j;i++){
            if(nums[j]>nums[i]){
                db[j] = Math.max(db[j],db[i]+1)
            }
        }
        result = Math.max(result, db[j]);
    }
    return result
};
复制代码

题二:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

力扣链接

思路

  • 声明一个数组
  • 两个for循环可以看成text1、text2的二维数组
/**
 * @param {string} text1
 * @param {string} text2
 * @return {number}
 */
var longestCommonSubsequence = function(text1, text2) {
  let arr = Array.from(new Array(text1.length+1),()=>new Array(text2.length+1).fill(0));
  for(let i=1;i<=text1.length;i++){
      for(let j=1;j<=text2.length;j++){
          if(text1[i-1] === text2[j-1]){
              arr[i][j] = arr[i-1][j-1]+1
          }else{
              arr[i][j] = Math.max(arr[i-1][j],arr[i][j-1])
          }
      }
  }
  return arr[text1.length][text2.length]
};
复制代码

tips: Array.from(arrayLike[, mapFn[, thisArg]])

  • arrayLike

  • 想要转换成数组的伪数组对象或可迭代对象。

  • mapFn 可选

  • 如果指定了该参数,新数组中的每个元素会执行该回调函数。

  • thisArg 可选

  • 可选参数,执行回调函数 mapFn 时 this 对象。

分类:
前端
标签: