Leetcode Leetcode 1202. Elementos de intercambio en una cadena (python)

Tema:

Le da una cadena s, y algunos pares de arreglos de "pares de índices" en la cadena, donde los pares [i] = [a, b] representan dos índices en la cadena (la numeración comienza desde 0).
Puede intercambiar los caracteres en cualquier par de índices en pares tantas veces como desee.
Devuelve lexicográficamente la cadena más pequeña en la que se puede convertir s después de varios intercambios.

Ejemplo 1:

Entrada: s = "dcab", pares = [[0,3], [1,2]]
Salida: "bacd"
Explicación:
intercambiar s [0] ys [3], s = "bcad"
intercambiar s [1 ] Y s [2], s = "bacd"

Ejemplo_2:

Entrada: s = "dcab", pares = [[0,3], [1,2], [0,2]]
Salida: "abcd"
Explicación:
Intercambiar s [0] ys [3], s = " "bcad"
intercambia s [0] ys [2], s = "acbd"
intercambia s [1] ys [2], s = "abcd"

Ejemplo_3:

Entrada: s = "cba", pares = [[0,1], [1,2]]
Salida: "abc"
Explicación:
intercambiar s [0] ys [1], s = "bca"
intercambiar s [1 ] Y s [2], s = "bac"
intercambian s [0] ys [1], s = "abc"

Solución:

Esta plantilla de conjunto disjunto basada en preguntas de idea completa implementó el
primer proceso de construcción del mapa:
el valor de s según una simulación del índice FIG n nodos
cada índice es un nodo
después de pasar por los pares en la matriz
se puede intercambiar nodo correspondiente Conectar

Luego es encontrar todos los nodos de China Unicom para guardar el gráfico conectado.
Ponga los mismos nodos raíz juntos . Utilice el
nodo raíz como
valor clave como matriz. Almacene el nodo raíz como raíz y verifique el índice de todos los nodos.

Finalmente, las relaciones conectadas correspondientes a cada nodo raíz se organizan individualmente en orden lexicográfico, y
los resultados clasificados se integran en res para completar

Código:

class UnionFind:
    def __init__(self,s):
        # 创建并查集图
        self.father = {
    
    i:i for i in range(len(s))}
        
    def find(self,x):
        # 查找根节点
        root = x
        
        while self.father[root] != root:
            root = self.father[root]
        
        # 路径压缩
        while x != root:
            original_father = self.father[x]
            self.father[x] = root
            x = original_father
        
        return root
    
    def merge(self, x, y):
        # 合并节点
        root_x, root_y = self.find(x), self.find(y)
        
        if root_x != root_y:
            self.father[root_x] = root_y
            

class Solution:
    def smallestStringWithSwaps(self, s: str, pairs: List[List[int]]) -> str:
        # 建图
        uf = UnionFind(s)

        for x, y in pairs:
            uf.merge(x, y)

        # 获取联通节点
        connected = collections.defaultdict(list)

        for node in range(len(s)):
            connected[uf.find(node)].append(node)


        # 重新赋值
        res = list(s)
        for nodes in connected.values():
            last = nodes
            string = sorted(res[d] for d in nodes)

            for e, f in zip(last,string):
                res[e] = f

        return "".join(res)

Resultado:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_50791900/article/details/112727756
Recomendado
Clasificación