var maxSubArray = function(nums) {
const dp = new Array(nums.length+1).fill(-101)
dp[0] = nums[0]
for(let i = 1;i<nums.length;i++) {
dp[i] = Math.max(dp[i-1]+nums[i],nums[i])
}
return Math.max(...dp)
};
var minDistance = function(word1, word2) {
const dpArr = Array.from(new Array(word1.length).fill(-1),()=>new Array(word2.length).fill(-1))
const dp = (i,j) => {
if(i===-1) {
return j+1
}
if(j===-1) {
return i+1
}
if(dpArr[i][j]!==-1) {
return dpArr[i][j]
}
if(word1[i] === word2[j]) {
dpArr[i][j] = dp(i-1,j-1)
return dpArr[i][j]
}
dpArr[i][j] = Math.min(
dp(i-1,j-1)+1,
dp(i,j-1)+1,
dp(i-1,j)+1
)
return dpArr[i][j]
}
return dp(word1.length-1,word2.length-1)
};
var longestCommonSubsequence = function(text1, text2) {
const arr = Array.from(new Array(text1.length).fill(-1),()=>new Array(text2.length).fill(-1))
const dp = (i,j) => {
if(i === -1 || j === -1) return 0
if(arr[i][j] !== -1) return arr[i][j]
if(text1[i] === text2[j]) {
arr[i][j] = dp(i-1,j-1)+1
return arr[i][j]
}
arr[i][j] = Math.max(
dp(i-1,j-1),
dp(i-1,j),
dp(i,j-1)
)
return arr[i][j]
}
return dp(text1.length-1,text2.length-1)
};
正则表达式匹配
从右边向左边匹配
var isMatch = function(s, p) {
const arr = Array.from(new Array(s.length),()=>new Array(p.length).fill(0))
const dp = (i,j) => {
if(i === -1 && j===-1) return true
if(i===-1) {
if(p[j]!=='*')
return false
else return dp(i,j-2)
}
if(j===-1) {
return false
}
if(arr[i][j]!==0) {
return arr[i][j]
}
if(s[i] === p[j] || p[j]==='.') {
arr[i][j]=dp(i-1,j-1)
return arr[i][j]
}
if(p[j]!=='*') {
s[i][j] = false
return false
}
if(s[i]!==p[j-1]&&p[j-1]!=='.') {
arr[i][j] = dp(i,j-2)
return arr[i][j]
}
arr[i][j] = dp(i-1,j) || dp(i-1,j-2) || dp(i,j-2)
return arr[i][j]
}
return dp(s.length-1,p.length-1)
};