最长公共子串
题目描述
对于两个字符串,请设计一个时间复杂度为O(m*n)的算法(这里的m和n为两串的长度),求出两串的最长公共子串的长度。
这里的最长公共子串的定义为两个序列U1,U2,..Un和V1,V2,…Vn,其中Ui + 1 == Ui+1,Vi + 1 == Vi+1,同时Ui == Vi。
给定两个字符串A和B,同时给定两串的长度n和m。
测试样例
“1AB2345CD”,9,”12345EF”,7
返回:4
代码
- 动态规划。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# -*- coding:utf-8 -*-
class LongestSubstring:
def findLongest(self, A, n, B, m):
table = [[0 for i in range(m + 1)] for j in range(n + 1)] # 这样初始化不用考虑[i-1]和[j-1]是否越界的问题
ans = 0
for i in range(1, n + 1):
for j in range(1, m + 1):
if A[i - 1] == B[j - 1]:
table[i][j] = table[i - 1][j - 1] + 1
ans = max(ans, table[i][j])
return ans
# 运行时间:180ms
# 占用内存:3156k
longestsubstring = LongestSubstring()
print longestsubstring.findLongest("1AB2345CD", 9, "12345EF", 7)
股票交易日
题目描述
在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行)。
给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益。请采用实践复杂度低的方法实现。
给定价格序列prices及它的长度n,请返回最大收益。保证长度小于等于500。
测试样例
[10,22,5,75,65,80],6
返回:87
代码
- 求出以i点为分割点,左半段最大收益的数组leftprof,和右半段最大收益的数组rightprof。
然后遍历,找出最大的leftprof[i]+rightprof[i]
组合。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26# -*- coding:utf-8 -*-
# coding=utf-8
class Stock:
def maxProfit(self, prices, n):
leftmin = prices[0]
rightmax = prices[n - 1]
leftprof = [0 for i in range(n)]
rightprof = [0 for i in range(n)]
sum = 0
for i in range(1, n):
leftmin = min(leftmin, prices[i]) # 从左向右找最小price记为leftmin
leftprof[i] = max(leftprof[i - 1], prices[i] - leftmin)
for j in range(0, n - 1)[::-1]:
rightmax = max(rightmax, prices[j]) # 从右向左找最大值记为rightmax
rightprof[j] = max(rightprof[j + 1], rightmax - prices[j])
for i in range(n): # 以i为分割点,左半段最大收益为leftprof[i],右半段最大收益为rightprof[i]
sum = max(sum, leftprof[i] + rightprof[i])
return sum
# 运行时间:50ms
# 占用内存:3156k
stock = Stock()
print stock.maxProfit([10, 22, 5, 75, 65, 80], 6)
之字形打印矩阵
题目描述
对于一个矩阵,请设计一个算法,将元素按“之”字形打印。具体见样例。
给定一个整数矩阵mat,以及他的维数nxm,请返回一个数组,其中元素依次为打印的数字。
测试样例
[[1,2,3],[4,5,6],[7,8,9],[10,11,12]],4,3
返回:[1,2,3,6,5,4,7,8,9,12,11,10]
代码
- 行是奇数时从左到右,行是偶数时从右到左。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# -*- coding:utf-8 -*-
class Printer:
def printMatrix(self, mat, n, m):
ans = []
for i in range(n):
if i % 2 == 0:
ans += mat[i]
else:
ans += mat[i][::-1]
return ans
# 运行时间:350ms
# 占用内存:3148k
printer = Printer()
print printer.printMatrix([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]], 4, 3)