Leetcode No.5 No.64 No.120作业报告
计算以当前节点为中间点的最长回文串
可能存在两种情况,中间点两个字符不相等或者相等
不相等时, 以该点为中心向两边扩散
相等时,以这两个点为中心向两边扩散
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
sLength = len(s)
bestResult = 1
bestStart = 0
bestEnd = 0
if sLength == 1:
return s
for i in range(1, sLength):
currentStart = i - 1
currentEnd = i + 1
currentResult = 1
while currentStart>=0 and currentEnd<sLength:
if s[currentStart]==s[currentEnd]:
currentResult = currentResult + 2
currentStart = currentStart - 1
currentEnd = currentEnd + 1
else:
break
if currentResult > bestResult:
bestResult = currentResult
bestEnd = currentEnd - 1
bestStart = currentStart + 1
if s[i-1]==s[i]:
currentStart = i - 2
currentEnd = i + 1
currentResult = 2
while currentStart>=0 and currentEnd<sLength:
if s[currentStart]==s[currentEnd]:
currentResult = currentResult + 2
currentStart = currentStart - 1
currentEnd = currentEnd + 1
else:
break
if currentResult > bestResult:
bestResult = currentResult
bestEnd = currentEnd - 1
bestStart = currentStart + 1
return s[bestStart: bestEnd+1]
- 作业截图
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021041211253227.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1eXk3NQ==,size_16,color_FFFFFF,t_70)
使用动态规划,从右下角往左上角更新当前节点到终点(右下角)的最短路径长度
class Solution(object):
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
m = len(grid)
n = len(grid[0])
init = grid[m-1][n-1]
dp = [[init for j in range(n)] for i in range(m)]
for i in range(n-2, -1, -1):
dp[m-1][i] = dp[m-1][i+1] + grid[m-1][i]
for i in range(m-2, -1, -1):
dp[i][n-1] = dp[i+1][n-1] + grid[i][n-1]
for i in range(m-2, -1, -1):
for j in range(n-2, -1, -1):
dp[i][j] = min( dp[i][j+1], dp[i+1][j] )+grid[i][j]
return dp[0][0]
- 作业截图
![在这里插入图片描述](https://img-blog.csdnimg.cn/202104121144488.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1eXk3NQ==,size_16,color_FFFFFF,t_70)
使用动态规划,自底向上更新最短路径
class Solution(object):
def minimumTotal(self, triangle):
"""
:type triangle: List[List[int]]
:rtype: int
"""
n = len(triangle)
dp = [0] * n
if n == 1:
return triangle[0][0]
for i in range(n):
dp[i] = triangle[n-1][i]
for i in range(n):
for j in range(n-i-1):
dp[j] = min(dp[j], dp[j+1])+triangle[n-i-2][j]
return dp[0]
- 作业截图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210412122001899.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3d1eXk3NQ==,size_16,color_FFFFFF,t_70)