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: