前言
忙了两天今天休息继续学习啦!。ok那么今天继续来做动态规划的题目。
第四天
延续昨天的题目数。
十二题
剑指 Offer 19. 正则表达式匹配
请实现一个函数用来匹配包含'. '和' * '的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"aba"均不匹配。
示例:
输入:s = 'aa' p = 'a'
输出:false
解释:'a' 无法匹配 'aa' 整个字符串
-
s可能为空,且只包含从a-z的小写字母。 -
p可能为空,且只包含从a-z的小写字母以及字符.和*,无连续的'*'。
思路: 通过上面可以看出,p是起到一个正则表达式的作用。这题……我居然直接写了几个小时,我有点感觉不到它和动态规划的关系,我的天呐。这里先留下我写到的部分吧,算是一个坑了55555以后回头来看看。
function isMatch(s: string, p: string): boolean {
if(s.length===0||p.length===0) return false
if(p.length===1&&s.length>1) return false
const sArray = s.split('')
const pArray = p.split('')
let result:string[] = []
let index = 0
for(let i = 0;i<pArray.length;i++){
if(pArray[0]==='*') return false
let a = pArray[i]==='*'?pArray[i-1]:pArray[i]
let b = pArray[i]==='*'
let c = pArray[i]==='*'||pArray[i+1]==='*'?true:false
for(let j = index;j<sArray.length;j++){
if(a==='.'){
result.push(sArray[j])
index++
}
if(sArray[j]===a){
result.push(sArray[j])
index++
}else{
if(c){
continue
}
index++
}
if(b){
if(sArray[j+1]!==a){continue }
}else{
continue
}
}
}
return result.join("")===s
};
当然也可以直接把p拿来当正则用,但那样的话就达不到锻炼算法的目的了,所以还是希望能以这种形式解题。害,写太久了。以后如果写了半个小时写不出来的话,就看看解题思路吧,否则效率太低下啦。
十三题
剑指 Offer 42. 连续子数组的最大和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例:
输入:nums=[-2,1,-3,4,-1,2,1,-5,4]
输出:6
reason:连续子数组[4,-1,2,1]的和最大,为6。
思路: 它的题意是,数组中的一个或连续多个正数组,把里面所有数加起来之后得到一个最大值。写了两段思路,一开始那段不知道怎么错的TAT太难了。最终还是一点一点照着最开始的示例顺出来了,还是要多多练习哇。
function maxSubArray(nums: number[]): number {
let max = nums[0]
for(let i = 1;i<nums.length;i++){
nums[i]=Math.max(nums[i-1]+nums[i],nums[i])
max = Math.max(max,nums[i])
}
return max
};
今天这两道直接给我难倒了,oh花费太多时间了。明天一定要补回来,都3点了我的天还要早起上班。
代码敲多了一定要起来走走喝水,要温故而知新。
下面是我的文章会引用到的作者和他的文章,都是跟着它学的,感谢。
作者:Krahets 链接:leetcode.cn/leetbook/re… 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。