前端重拾算法数据结构一个月(4)

95 阅读3分钟

前言

忙了两天今天休息继续学习啦!。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) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。