1. 动态规划算法:

题目:
给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。

'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:

s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/wildcard-matching

var isMatch = function(s, p) {
  let cur = new Array(s.length + 1).fill(false)
  cur[0] = true
  
  for (const c of p) {
    if (c == '*'){
      let begin = cur.indexOf(true)
      if (begin == -1) {
        return false
      }
      cur.fill(true, begin)
    } else {
      for(let j = s.length;j > 0; --j){
        cur[j] = (c == '?' || c == s[j-1]) && cur[j-1]
      }
      cur[0] = false
    }

  }
  return cur[s.length]

};

2. 两数相加

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解答:

// 第一种
var twoSum = function(nums, target) {
    let re = []
    for (let i = 0;i<nums.length;i++){
        let item = nums[i]
        let j = nums.indexOf(target-item)
        if (j > -1) {
            if (j !==i){
              return [i, j]
            }

        }
    }
};

// 第二种
var twoSum = function (nums, target) {
    let map = {};
    for (let i = 0, len = nums.length; i < len; i++) {
        let num = target - nums[i];
        if (typeof map[nums[i]] === 'number') return [map[nums[i]], i];
        map[num] = i;
    }
};

// 第三种 (超出输出范围?)
var twoSum = function(nums, target) {
    for(let j =0;j<nums.length;j ++) {
        console.log(j,nums[j])
      for(i=nums.length-1 ;i >j; i--) {
          console.log(nums[j],nums[i])
          if(nums[j] + nums[i] === target) {
              return [i, j]
          }
      }  
    }
};