最近刷題刷到了一道關於字串換位置的題目,採用的解法是合併集的方法,於是參考了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 就一分鐘而言,只有在這種情況下,烤牛排才是最好的。幸運的是,廚房裡的裝置已經配備了人工智慧,可以在最短的時間內快速完成整個過程。該裝置的溫度每分鐘可公升高或降低一度。當溫度在規...