leetcode T5需要解决的时一个最长回文子串,大致思想在教程中给的很清晰了,一个是动态规划,一个是通过找对称关系一步步衍生扩大,还有一个思想是将子串倒过来然后找longest common tree.
这里提一下一个简单的解决longest common tree的解法
动态规划
思想很简单,构建一个数组,一个式子就能表达清楚:
a[i][j] = a[i-1][j-1]+1 if s[i] == s[j]
python code如下:
def LCS(s1, s2):
m = len(s1)
n = len(s2)
array = []
array = [[0 for i in range(n+1)] for j in range(m+1)]
for i in range(1, m+1):
for j in range(1, n+1):
array[i][j] = array[i-1][j-1] + 1 if s1[i-1]==s2[j-1] else 0
return array
思想很简单,不过复杂度并不算很优化:
算法复杂度:O(n²), 空间复杂度:O(n²)
Suffix Tree
大致思想是首先构造一颗简单的suffix tree.
然后在suffix tree中进行查找.
东西太多了直接上链接:CSDN
同时说下在码的过程中碰到的问题:
使用python创建高维list时需要小心,尽量采用for去创建,而不是用例如:
list = [1] * 3
类似的式子,原因参考
Geeking
网友评论