題目連結:
定義兩字串 S 、 T 的「相似」為:
S、T 的 LCS 之長度不小於 min( |S|, |T| ) ÷ 2.0
現在輸入的第一列給定一正整數 T (1 ≦ T ≦ 3),代表有 T 組的測試資料。每組測試資料的第一列給定一正整數 N (1 ≦ N ≦ 50),代表有 N 個字串。接著的 N 列輸入,代表這 N 個字串的內容(長度不超過 50 個字元,且皆由小寫字母組成)
根據字串相似的定義,可以將這 N 個字串分作好幾個團體。任意一組來自兩個團體的不同字串彼此不相似。求當中最大的團體,其包含的字串之數量為何?
3
5
abc
adb
xyzzzz
zzzxop
xompn
5
abc
adb
xyzzzz
zzzxop
xoapd
5
abc
adb
xyzzzz
zzzxop
xoape
首先,對於每對可能的字串對,作一次它們的最長共同子序列(Longest Common Subsequences,即 LCS。作法可見
以前的文章)。
判斷是否符合相似的定義。若符合,則將此對字串以併查集(Union-Find Set ,
以前的文章有介紹過專門的練習題)串接起來。將兩者所屬的集合並在一起,形成一個新的團體。
最後看哪個字串在並查集的結構中的「rank」最大(表示以這個字串為根的樹之大小,在本題即團體的大小),即是所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。