正则表达式
- 问题描述:请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含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