def foo(num_list):
'''求陣列中最大子串行的和,子串行必須連續
'''length=len(num_list)
max_value=-10000000000
tmp=0
for i in range(length):
tmp=max(tmp+num_list[i], num_list[i])
max_value=max(max_value, tmp)
print max_value
1)最長公共子串
def find_lcsubstr(s1, s2):
m=[[0 for i in range(len(s2)+1)] for j in range(len(s1)+1)] #生成0矩陣,為方便後續計算,比字串長度多了一列
mmax=0 #最長匹配的長度
p=0 #最長匹配對應在s1中的最後一位
for i in range(len(s1)):
for j in range(len(s2)):
if s1[i]==s2[j]:
m[i+1][j+1]=m[i][j]+1
if m[i+1][j+1]>mmax:
mmax=m[i+1][j+1]
p=i+1
return s1[p-mmax:p],mmax #返回最長子串及其長度
print find_lcsubstr('abcdfg','abdfg')
2)最長公共子串行
import numpy
def find_lcseque(s1, s2):
# 生成字串長度加1的0矩陣,m用來儲存對應位置匹配的結果
m = [ [ 0 for x in range(len(s2)+1) ] for y in range(len(s1)+1) ]
# d用來記錄轉移方向
d = [ [ none for x in range(len(s2)+1) ] for y in range(len(s1)+1) ]
for p1 in range(len(s1)):
for p2 in range(len(s2)):
if s1[p1] == s2[p2]: #字元匹配成功,則該位置的值為左上方的值加1
m[p1+1][p2+1] = m[p1][p2]+1
d[p1+1][p2+1] = 'ok'
elif m[p1+1][p2] > m[p1][p2+1]: #左值大於上值,則該位置的值為左值,並標記回溯時的方向
m[p1+1][p2+1] = m[p1+1][p2]
d[p1+1][p2+1] = 'left'
else: #上值大於左值,則該位置的值為上值,並標記方向up
m[p1+1][p2+1] = m[p1][p2+1]
d[p1+1][p2+1] = 'up'
(p1, p2) = (len(s1), len(s2))
print numpy.array(d)
s =
while m[p1][p2]: #不為none時
c = d[p1][p2]
if c == 'ok': #匹配成功,插入該字元,並向左上角找下乙個
p1-=1
p2-=1
if c =='left': #根據標記,向左找下乙個
p2 -= 1
if c == 'up': #根據標記,向上找下乙個
p1 -= 1
s.reverse()
return ''.join(s)
print find_lcseque('abdfg','abcdfg')
子串行 子串
1 第一種思路模板是乙個一維的 dp 陣列 int n array.length int dp newint n for int i 1 i n i 例如 最長遞增子串行 在這個思路中 dp 陣列的定義是 在子陣列 array 0 i 中,我們要求的子串行 最長遞增子串行 的長度是 dp i 2 第...
最長回文子串 回文子串行 公共子串行
一 最長回文子串 連續 1.manacher演算法 見前面 2.動態規劃 bool p 100 100 for int i 0 i 2 reutrn s.substr start,maxlength 二 最長回文子串行 不連續 1.遞迴 2.動態規劃 3.將字串反轉,再求兩個字串的最長公共子串行lc...
兩子串的公共子串行
兩子串的公共子串行,子串行的問題難比子串,暴力也難搞,動態規劃 好,1.確定dp i j dp i j 表示字串str1的 0,i 和str2的 0,j 的最大公共子串行 2.填已經確定的dp值,這裡是第一行str1的 0,n1 和str2的 0 的最大公共子串行,第一列str1的 0 和str2的...