合併集列題與理解

2021-10-06 15:06:47 字數 1540 閱讀 5916

最近刷題刷到了一道關於字串換位置的題目,採用的解法是合併集的方法,於是參考了csdn上的一篇文章,發現很容易理解。

題目給你乙個字串 s,以及該字串中的一些「索引對」陣列 pairs,其中 pairs[i] = [a, b] 表示字串中的兩個索引(編號從 0 開始)。

你可以 任意多次交換 在 pairs 中任意一對索引處的字元。

返回在經過若干次交換後,s 可以變成的按字典序最小的字串。

輸入:s = 「dcab」, pairs = [[0,3],[1,2]]

輸出:「bacd」

解釋:交換 s[0] 和 s[3], s = 「bcad」

交換 s[1] 和 s[2], s = 「bacd」

從題目中可以理解到首先需要將pairs中相互影響的,相互聯絡的數字湊成乙個大的集合,然後在這個集合中公升序排序字元,然後再在各個位置上放置相應的字元,這裡把這個大集合想想成乙個大的幫派,同時這個幫派在不斷的擴容變大,pairs集合陣列中就是建立友好的協議的證明。

於是首先初始化每個人乙個幫派,接著通過pairs將相互想要建交的幫派融合,融合後選擇後面位置的為新幫派的老大,可以通過合併集實現如下

for

(int i =

0; i < len;

++i) root[i]

= i;

for(

int i =

0; i < pairs.

size()

;++i)

;}

其中find()函式為尋找自身老大的過程,

public

intfind

(int son)

while

(root[temp]

!=son)

return son;

}

通過不斷的判斷自己的當前上司是不是總上司,然後再讓自己直接服務於總上司。

在字元排序的過程使用單調優先佇列,由小頂堆實現底層,可以直接取堆頂元素來放置相應於的位置,總的**如下

int

root;

public string smalleststringwithswaps

(string s, list

> pairs);}

map> cache =

newhashmap

<

>()

;for

(int i =

0; i < len;

++i)

stringbuilder sb =

newstringbuilder()

;for

(int i =

0; i < len;

++i)

return sb.

tostring()

;}public

intfind

(int son)

while

(root[temp]

!=son)

return son;

}

T SQL行合併成列與列拆分成行

原文 t sql行合併成列與列拆分成行 本文出處 感覺最近sql也沒少寫,突然有一點生疏了,對於用的不是太頻繁的一些操作,時間一久就容易生。多行的某乙個列合併成乙個列 另外是乙個相反的操作,借助上面合併之後的結果,將乙個多個值的字串列拆分開來,轉換為多行,用到的字串拆分函式,比較常見 create ...

MOOC資料結構課程 題集15 列出連通集

06 圖1 列出連通集 25 分 給定乙個有n個頂點和e條邊的無向圖,請用dfs和bfs分別列出其所有的連通集。假設頂點從0到n 1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。輸入第1行給出2個整數n 0按照 的格式,每行輸出乙個連通集。先輸出dfs的結果,再輸出...

牛客題集 Cook Steak(警示 理解題意)

cook steak 題目鏈結 題目譯文 對於烤牛排,zjh認為它需要n道燒烤工序,每道工序都在乙個溫度範圍內 li,ri 就一分鐘而言,只有在這種情況下,烤牛排才是最好的。幸運的是,廚房裡的裝置已經配備了人工智慧,可以在最短的時間內快速完成整個過程。該裝置的溫度每分鐘可公升高或降低一度。當溫度在規...