Leetcode刷题10.18——最长回文子串 & 最小路径和

leetcode 5 最长回文子串

  回文串即组成的字符左右对称的字符串(注意b和d可不是回文字orz)。此题需要求给定字符串的最长回文子字符串,主要采用动态规划的方法,需要注意的点为:

  • 初始判断条件(最小回文串——1个字符和两个相等字符)
  • 遍历时两个指针的移动边界和方向(必须保证dp[i][j]每次都能够关联到dp[i+1][j-1],因此j在外层从前至后遍历整个字符串,i在内层从前至j遍历)
  • 需要一个记录最长串起始位置的额外变量,同时注意其随着最大长度的变化而变化,不要直接用max函数处理最大长度

  自己的代码如下,注意点都标在注释中了:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        maxLen = 1
        maxi = 0
        if len(s) < 2:
            return s
        dp = [[0]*len(s) for i in range(len(s))]
        for i in range(0, len(s)):     # 初始化单个字符状态——单个字符一定是回文串
            dp[i][i] = True
            maxLen = 1
            maxi = len(s)//2
        for j in range(1, len(s)):
            for i in range(0,j):
                if j-i < 3 and s[i] == s[j]:  # 初始判断条件(主要是判断两个字开始组成的回文串)
                    dp[i][j] = True
                    if maxLen < j-i+1:      # 要注意这里不要用max函数。因为记录最长回文串起始坐标的变量maxi也是随着maxLen的变化而变化的,博主一开始马虎这里就出错了
                        maxLen = j-i+1
                        maxi = i
                elif dp[i+1][j-1] and s[i] == s[j]:  # 后面的直接关联到上一个状态的字符串(只有上一个字符串是回文,并且当前两个相等的情况下才是回文串)
                    dp[i][j] = True
                    if maxLen < j-i+1:
                        maxLen = j-i+1
                        maxi = i
                else:
                    dp[i][j] = False
        return s[maxi:maxi+maxLen]         # 时刻提醒自己python的索引都!是!左闭右开的

 leetcode 64 最小路径和

  乍看之下好像是一道非常典型的二维动态规划,实际上有许多需要注意的地方:

  • 对于行走路线,只能从左往右和从上往下的限制,因此考虑两个特殊情况——第i = 0行和第j = 0列;第0行只能从左边过来,因此不需要动态规划判断,同理第0列只能从上方走过来,也不需要判断
  • 对于dp数组,直接在输入的二维数组上修改就可以,不要再创建新的变量了
class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        for i in range(len(grid)):  # 这里注意二维数组的索引方式,对整个数组求len是求行数
            for j in range(len(grid[0])):  # 对其中一个向量求len是求列数
                if i == 0 and j == 0:   # 注意原点需要特别关照
                    continue
                elif i == 0:
                    grid[i][j] += grid[i][j-1]     # 注意要自加(+=),别不小心写成直等
                elif j == 0:
                    grid[i][j] += grid[i-1][j]
                else:
                    grid[i][j] += min(grid[i-1][j], grid[i][j-1])   # 状态转移——上面和左面过来选择较小的那个
        return grid[-1][-1]   # 返回最后一个元素,注意这里的索引方式
原文地址:https://www.cnblogs.com/nekoneko-15/p/13843847.html