Leetcode 1202. 交换字符串中的元素 Golang解题

解题思路参照:
https://blog.csdn.net/qq_17550379/article/details/101281816

解题思路就是交并集的使用, 需要使用路径压缩算法进行优化
Golang版:

func smallestStringWithSwaps(s string, pairs [][]int) string {
    pre:=make([]int, len(s))
    for i:=0;i<len(s);i++{pre[i]=i}
    //相当于join的功能
    for _, v:= range pairs{
        x, y:=find(pre, v[0]), find(pre, v[1])
        if x!=y{pre[x]=y}
    }
    
    un:=make(map[int][]int)
    for i:=0;i<len(s);i++{
        x:=find(pre, i)
        if _,ok:=un[x];ok{
            un[x]=append(un[x], int(s[i]))
        }else{
            un[x]=append([]int{}, int(s[i]))
        }
    }
    for k, _ := range un{sort.Ints(un[k])}

    res := make([]byte, len(s))
    for i:=0;i<len(s);i++{
        x:=find(pre, i)
        res[i]=byte(un[x][0])
        un[x]=un[x][1:]
    }
    return string(res)
}


func find(pre []int, x int) int{
    r:=x
    for pre[x]!=x{
        x=pre[x]
    }
    //路径压缩
    i:=0
    for pre[r]!=x{
        i=pre[r]
        pre[r]=x
        r=i
    }
    return x
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值