zoukankan      html  css  js  c++  java
  • 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]   # 返回最后一个元素,注意这里的索引方式
  • 相关阅读:
    获取账号所有联系人
    获取用户的初始信息展示
    pip升级的错误
    二维码长轮询获取登陆并获取用户基本信息
    获取微信二维码
    WebChat理清流程
    python的requests模块
    python的单例模式和__new__方法
    matplotlib 基础知识汇总
    pandas数据分析案例:美国2012年总统候选人政治献金数据分析
  • 原文地址:https://www.cnblogs.com/nekoneko-15/p/13843847.html
Copyright © 2011-2022 走看看