題目連結:
題目意譯:
你被給定一個字串陣列 words 以及一個二元陣列 groups,兩者長度皆為 n。其中 words[i] 跟 groups[i] 是互相對應的。
你的任務是從 words 中選出最長的交錯子序列。words 中的一個子序列是「交錯」的,代表著序列中任兩個相鄰字串,它們在二元陣列 groups 中對應的元素是不同的。也就是說,你需要選擇一些字串使得它們兩兩在 groups 對應的位元不同。
更正式地說,你需要從 [0, 1, ……, n - 1] 找到一個最長的索引值陣列,以 [i0, i1, ……, ik-1] 表示,使得對於每一個 0 ≦ j < k - 1 的 j 值滿足 groups[ij] != groups[ij+1]。並用這些索引值在 words 中找到對應的字串。
回傳選出的子序列。如果有多個答案,則回傳任意一個。
注: words 中的元素彼此相異。
限制:
1 ≦ n == words.length == groups.length ≦ 100
1 ≦ words[i].length ≦ 10
groups[i] is either 0 or 1.
words 包含著彼此相異的字串。
words[i] 由小寫英文字母組成。
範例測資:
範例 1:
輸入: words = ["e","a","b"], groups = [0,0,1]
輸出: ["e","b"]
解釋: 可以選出的一個子序列為 ["e","b"],因為 groups[0] != groups[2]。另一個可選出的子婿列為 ["a","b"],因為 groups[1] != groups[2]。可以證明滿足條件的最長索引值子序列的長度為 2。
範例 2:
輸入: words = ["a","b","c","d"], groups = [1,0,1,1]
輸出: ["a","b","c"]
解釋: 可以選出的一個子序列為 ["a","b","c"],因為 groups[0] != groups[1] 且 groups[1] != groups[2]。另一個可選出的子婿列為 ["a","b","d"],因為 groups[0] != groups[1] and groups[1] != groups[3]。可以證明滿足條件的最長索引值子序列的長度為 3。
解題思維:
很明顯地可以看到,一個挑出來的子序列在 groups 對應的序列只會是 0 或是 1 開頭的。而既然只有兩種可能的開頭,不如就直接窮舉每一種開頭最多可以選出多少個元素,取最長者即可。
而對於單一一種開頭而言,同樣也很明顯地,第一個元素應挑越早出現的越好(例如說,要 1 開頭則我們應在 groups 中找到最左邊的 1)。挑完第一個元素後,接下來也是同理,也是挑越早符合條件的越好(例如說,前一次是 0,則這次是 1;反之亦然)。然後以此類推直到 groups 中所有元素都被掃過一次為止。此時挑得的子序列即是此種開頭下最長者。
最後兩種開頭選最長的出來後記得回去把對應的 words 中的字串抓出來才是所求(也可以在掃過 groups 時一併抓取)。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。