[Leetcode] [Tutorial] Programación dinámica multidimensional


62. Diferentes caminos

Un robot está ubicado en un m ∗ * n La esquina superior izquierda de la cuadrícula (el punto de inicio está marcado como "Inicio" en la imagen siguiente).

El robot sólo puede moverse un paso hacia abajo o hacia la derecha a la vez. El robot intenta llegar a la esquina inferior derecha de la cuadrícula.

¿Cuántos caminos diferentes hay en total?

Ejemplo 1:

Entrada: m = 3, n = 7
Salida: 28

Solución

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[1] * n for _ in range(m)]
        for i in range(1, m):
            for j in range(1, n):
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
        return dp[m - 1][n - 1]

64. Suma de ruta mínima

Dada una cuadrícula mxn que contiene números enteros no negativos, encuentre una ruta desde la esquina superior izquierda hasta la esquina inferior derecha de modo que la suma de los números en la ruta sea mínima.

Nota: Solo puedes moverte un paso hacia abajo o hacia la derecha a la vez.

Ejemplo:

Entrada: grid = [[1,3,1],[1,5,1],[4,2,1]]
Salida: 7
Explicación: Porque la suma de la ruta 1→3→1→1→1 es el mas pequeño.

Solución

5. La subcadena palíndromo más larga.

Dada una cadena s, encuentre la subcadena palíndromo más larga en s.

Ejemplo:
Entrada: s = "babad"
Salida: "bab"
Explicación: "aba" también es una respuesta que se ajusta al significado de la pregunta.

Solución

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        if n < 2:
            return s

        # 初始化动态规划的表
        dp = [[False] * n for _ in range(n)]
        start = 0  # 记录最长回文子串的起始位置
        max_len = 1  # 记录最长回文子串的长度

        # 初始化长度为1的所有子串为回文
        for i in range(n):
            dp[i][i] = True

        # 动态规划填表
        for j in range(1, n):
            for i in range(0, j):
                if s[i] == s[j]:
                    if j - i < 3:
                        dp[i][j] = True
                    else:
                        dp[i][j] = dp[i + 1][j - 1]

                # 更新最长回文子串的信息
                if dp[i][j]:
                    if j - i + 1 > max_len:
                        max_len = j - i + 1
                        start = i

        return s[start:start + max_len]

La idea básica de utilizar el algoritmo de expansión central es considerar cada carácter como el centro del palíndromo y expandirlo hacia afuera. Tenga en cuenta que un palíndromo puede tener una longitud par o impar. Por ejemplo, "aba" es un palíndromo de longitud impar, centrado en "b"; y "abba" es un palíndromo de longitud par, centrado en "bb".

Podemos recorrer cada carácter de la cadena e intentar expansiones pares e impares para cada carácter para encontrar la subcadena palíndromo más larga.

class Solution:
    def longestPalindrome(self, s: str) -> str:
        # 特殊情况,空字符串或长度为1的字符串直接返回
        if len(s) < 2:
            return s
        
        start = 0  # 最长回文子串的起始位置
        max_len = 1  # 最长回文子串的长度

        for i in range(len(s)):
            # 奇数长度的回文检查
            l, r = i, i
            while l >= 0 and r < len(s) and s[l] == s[r]:
                l -= 1
                r += 1
            if r - l - 1 > max_len:
                max_len = r - l - 1
                start = l + 1

            # 偶数长度的回文检查
            l, r = i, i + 1
            while l >= 0 and r < len(s) and s[l] == s[r]:
                l -= 1
                r += 1
            if r - l - 1 > max_len:
                max_len = r - l - 1
                start = l + 1

        return s[start: start + max_len]

Supongo que te gusta

Origin blog.csdn.net/weixin_45427144/article/details/132247979
Recomendado
Clasificación