前往
大廳
主題

LeetCode - 1286. Iterator for Combination 解題心得

Not In My Back Yard | 2022-05-08 00:00:08 | 巴幣 0 | 人氣 143

題目連結:


題目意譯:
實作類別 CombinationIterator:
CombinationIterator(string characters, int combinationLength) 初始化一個物件,其有著一已排序之相異小寫英文字元之字串 characters,以及一數字 combinationLength 作為兩參數。
next() 回傳下一個長度 combinationLength 在字典序中的下一個組合。
hasNext() 回傳真(True)若且唯若其存在著下一個組合。

限制:
1 ≦ combinationLength ≦ characters.length ≦ 15
characters 中的字元皆相異。
至多 10 ^ 4 次呼叫 next 和 hasNext。
保證所有 next 函式之呼叫皆合法。



範例測資:
範例 1:
輸入
["CombinationIterator", "next", "hasNext", "next", "hasNext", "next", "hasNext"]
[["abc", 2], [], [], [], [], [], []]
輸出
[null, "ab", true, "ac", true, "bc", false]
解釋
CombinationIterator itr = new CombinationIterator("abc", 2);
itr.next();    // 回傳 "ab"
itr.hasNext(); // 回傳 真
itr.next();    // 回傳 "ac"
itr.hasNext(); // 回傳 真
itr.next();    // 回傳 "bc"
itr.hasNext(); // 回傳 假(False)


解題思維:
首先,第一個組合相當單純。就是 characters 中的前 combinationLength 個字元。例如,characters = "abcde",combinationLength = 3,則第一個組合即為 "abc"

那剩下的呢?可以看到因為由於我第一個組合中最後一個字元 'c' 在 characters 並不是最後一個字元,所以其還可以往右跑,也就是說我們還可以生出字典序更大的。也就是 "abd"

同理,"abd" 的 'd' 還可以往右,所以得到 "abe"

而現在可以看到這個 'e' 已經到底,無法繼續移動,但是我們的 'b' 可以往右變成 'c',而 'e' 可以重置回到 'd'(也就是 'c' 的下一個位置)。因此得到 "acd"

接著就跟一開始一樣,'d' 往右,得到 "ace"

'e' 卡住,因此 'c' 往右。得到 "ade"

以此類推……。直到我們的組合是最後 combinationLength 個字元時,就是最後的一個組合,此時就不再有下一個組合(所以此時 hasNext() 將回傳假)。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作