剑指offer: 正则表达式,机器人的活动范围,滑动窗口最大值

正则表达式


  • 问题描述:请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配
  • 解题思路: 模式匹配,考虑到为全匹配,可以基于模式串做状态转移,其中,比较麻烦的是‘*’的匹配实现,为了简便,这里使用递归解决,枚举‘*’产生的所有串,仅为了快速解题采用,注意:
    a$ <=> a*a$ 时 由于优先匹配并没有向前探查模式串是否含‘*’, 所以要对该情形做一次回溯,也可以优先匹配时向前探查避免这个问题。
# -*- coding:utf-8 -*- 
class Solution:
    # s, pattern都是字符串
    def match(self, s, pattern):
        i,j = 0,0        
        slen = len(s)
        plen = len(pattern)
        while j < plen:
            if i < slen and (s[i] == pattern[j]
                   or pattern[j] == '.'):
                i += 1 
                j += 1
            elif i and i < slen and j and pattern[j] == '*':
                for r in range(slen-i+1):
                    if self.match(s[i:],pattern[j-1]*r+pattern[j+1:]):
                        return True
                return False
            elif pattern[j] == '*':
                if j+1<plen and self.match(s[i-1:],pattern[j+1:]):
                    return True
                j += 1
            elif j+1 < plen and pattern[j+1] == '*':
                j += 2
            else:
                return False
        if i < slen:
            return False
        return True

机器人的活动范围


  • 问题描述:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
  • 解题思路: 深度优先,广度优先,递归的、迭代的,都可以解决。注意:行列索引从0开始。
# -*- coding:utf-8 -*-
class Solution:
    def movingCount(self, threshold, rows, cols):
        cnt = 0
        queue = [(0, 0)]
        visited = [[False for j in range(cols)] for i in range(rows)]
        visited[0][0] = True
        dir = [0, 1, 1, 0, -1, 0, 0, -1]
        while queue:
            i, j = queue[0]
            num = 0
            while i:
                num += i % 10
                i = i/10
            while j:
                num += j % 10
                j = j/10
            i,j = queue.pop(0)
            if num <= threshold:
                cnt += 1
                for di, dj in zip(*[iter(dir)] * 2):
                    ni = i + di
                    nj = j + dj
                    if ni < 0 or ni >= rows or nj < 0 or nj >= cols\
                            or visited[ni][nj]:
                        continue
                    visited[ni][nj] = True
                    queue.append((ni, nj))

        return cnt

滑动窗口最大值


  • 问题描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

  • 解题思路: 无fa可说

# -*- coding:utf-8 -*-

class Solution:
    def maxInWindows(self, num, size):
        if size==1:
            return num
        elif size<=0 or size>len(num):
            return []
        cnt = len(num) - size + 1
        maxi = 0
        for i in range(1,size):
            if num[i] > num[maxi]:
                maxi = i
        retn = [num[maxi]]
        for i in range(1,cnt):
            if maxi <= i:
                maxi = i
                for j in range(1,size):
                    if num[i+j] > num[maxi]:
                        maxi = j+i
            elif num[maxi] < num[i+size-1]:
                 maxi = i+size-1

            retn.append(num[maxi])
        return retn

猜你喜欢

转载自blog.csdn.net/qq_35279914/article/details/82146952