Shu-How Zの小窝

Loading...

1202.交换字符串中的元素

1202.交换字符串中的元素

1:42

1交换 2.按着字典序排序 3.拼接字符串
1.根据这个二维数组pairs,获取可以交换的字母,然后可以交换的字母组成一组。
2.对组内的字母进行排序。
3.接着根据字符串中组号获取我们组内最小的字符进行拼接。最后得到的字符串就是我们所需要的进行排过序的字符串;

// 定义并查集类
class UnionFind{
    // 构造函数初始化并查集
    constructor(n){
        this.parent = new Array(n).fill(0).map((item,index)=>index)
        this.rank = new Array(n).fill(1)
        this.count = n
    }
    // 查找元素的根节点
    find(x){
        if(this.parent[x] !== x){
            this.parent[x] = this.find(this.parent[x])
        }
        return this.parent[x]
    }
    // 合并两个集合
    union(x,y){
        let rootX = this.find(x)
        let rootY = this.find(y)
        if(rootX === rootY){
            return false
        }
        if(this.rank[rootX] < this.rank[rootY]){
            this.parent[rootX] = rootY
            this.rank[rootY] += this.rank[rootX]
        }else{
            this.parent[rootY] = rootX
            this.rank[rootX] += this.rank[rootY]
        }
        this.count--
    }
    // 判断两个元素是否属于同一个集合
    connected(x,y){
        return this.find(x) === this.find(y)
    }
    // 获取集合的数量
    getCount(){
        return this.count
    }
}
/**
 * @param {string} s
 * @param {number[][]} pairs
 * @return {string}
 */
var smallestStringWithSwaps = function(s, pairs) {
    let len=s.length
    let uf = new UnionFind(len)
    //1.将可以进行交换的字符进行联通
    for(let i=0;i<pairs.length;i++){ //先拿到索引对,遍历数组
        let index1 = pairs[i][0]  //拿到里面的每一对数组
        let index2 = pairs[i][1]
        if(uf.find(index1)!==uf.find(index2)){ //拿到两个索引,进行联通
            uf.union(index1,index2) 
        }
    }
    //2.先拿到联通后的数组
    let fa=uf.parent;
    //将联通的字符存入到一个新的数组里面进行排序
    let vec=new Array(len).fill(0).map(()=>new Array());//根据祖先节点进行分组,value 是组里面的字符串的结合
    for(let i=0;i<len;i++){
        fa[i]=uf.find(i)
        vec[fa[i]].push(s[i])
    }
    for(let i=0;i<len;i++){
        if(vec[i].length>0){
            vec[i].sort((a,b)=>a.charCodeAt()-b.charCodeAt()) //按着字典序排序//ASCII
        }
    }
    //3.通过原始字符坐标,获取字符的组号,拼接字符串
    //记录每一组字符串位置
    let p=new Array(len).fill(0)
    //输出字符的数组
    let ans=[]
    for(let i=0;i<len;i++){
        ans.push('1')
    }
    //通过原始字符坐标,获取字符的组号,拼接字符串
    for(let i=0;i<len;i++){
        ans[i]=vec[fa[i]][p[fa[i]]]
        p[fa[i]]++
    }
    return ans.join('')
};
let s = "dcab", pairs = [[0,3],[1,2]]
console.log(smallestStringWithSwaps(s,pairs))
posted @ 2025-04-30 16:46  KooTeam  阅读(11)  评论(0)    收藏  举报