子串行 子串

2021-08-29 07:35:03 字數 2002 閱讀 6471

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的...