[LeetCode] Desafío semanal Realizar cambios de cadena

Se le da una cadena s que contiene letras minúsculas en inglés y un cambio de matriz, donde shift [i] = [direction, cantidad]:

  • la dirección puede ser 0 (para desplazamiento a la izquierda) o 1 (para desplazamiento a la derecha).
  • cantidad es la cantidad por la cual la cadena s debe ser desplazada.
  • Un desplazamiento a la izquierda en 1 significa eliminar el primer carácter de sy agregarlo al final.
  • Del mismo modo, un desplazamiento a la derecha en 1 significa eliminar el último carácter de sy agregarlo al principio.
    Devuelve la cadena final después de todas las operaciones.

Ejemplo 1:

Input: s = "abc", shift = [[0,1],[1,2]]
Output: "cab"
Explanation: 
[0,1] means shift to left by 1. "abc" -> "bca"
[1,2] means shift to right by 2. "bca" -> "cab"

Ejemplo 2

Input: s = "abcdefg", shift = [[1,1],[1,1],[0,2],[1,3]]
Output: "efgabcd"
Explanation:  
[1,1] means shift to right by 1. "abcdefg" -> "gabcdef"
[1,1] means shift to right by 1. "gabcdef" -> "fgabcde"
[0,2] means shift to left by 2. "fgabcde" -> "abcdefg"
[1,3] means shift to right by 3. "abcdefg" -> "efgabcd"

Restricciones:

  1. 1 <= s.length <= 100
  2. s solo contiene letras minúsculas en inglés.
  3. 1 <= shift.length <= 100
  4. shift [i] .length == 2
  5. 0 <= desplazamiento [i] [0] <= 1
  6. 0 <= desplazamiento [i] [1] <= 100

La idea de esta pregunta es relativamente sencilla: después del análisis, se descubre que no es necesario mover s cada vez, porque la complejidad temporal de mover s es O (L), y reducir el movimiento reduce la complejidad. Todo lo que debe hacerse es fusionar todos los movimientos, fusionar todos en la misma dirección primero, y luego comparar a izquierda y derecha para ver cómo debe ser el movimiento final. Una cosa a tener en cuenta es que después de que todos los cambios se hayan recopilado finalmente, puede ser más largo que s, así que tome un módulo. Si la duración del cambio es N, entonces la complejidad del tiempo final de este problema es O (N + L), y la complejidad del espacio es O (L). Esto es necesario para copiar la cadena.

class Solution:
    def stringShift(self, s: str, shift: List[List[int]]) -> str:
        if not s or not shift: return s
        
        move = [0,0]
        for sh in shift:
            move[sh[0]] += sh[1]
        move = [x % len(s) for x in move]
        
        if move[0] == move[1]:
            return s
        elif move[0] < move[1]:
            r_step = move[1] - move[0]
            return s[-r_step:]+s[0:-r_step]
        else:
            l_step = move[0] - move[1]
            return s[l_step:]+s[0:l_step]

Supongo que te gusta

Origin www.cnblogs.com/codingEskimo/p/12702285.html
Recomendado
Clasificación