ETH官方钱包

前往
大廳
主題

LeetCode - 763. Partition Labels 解題心得

Not In My Back Yard | 2022-08-11 12:00:06 | 巴幣 110 | 人氣 326

題目連結(jié):


題目意譯:
你被給定一個字串 s。我們想要分割該字串變?yōu)楸M可能多的部分使得每種字母最多只出現(xiàn)於其中一個部分。

注意到一個分割為將所有部分根據(jù)順序串接在一起後得到的字串應(yīng)為 s 本身。

回傳一個整數(shù)串列代表著每個部分的長度。

限制:
1 ≦ s.length ≦ 500
s 由小寫英文字母組成。



範例測資:
範例 1:
輸入: s = "ababcbacadefegdehijhklij"
輸出: [9,7,8]
解釋:
一個分割為 "ababcbaca" 、 "defegde" 、 "hijhklij"。
而這個分割使得每種字母最多只各自出現(xiàn)於其中一個部分。
而例如 "ababcbacadefegde" 、 "hijhklij" 之分割是不對的,因為它只將 s 分成兩個部分。

範例 2:
輸入: s = "eccbbbbdec"
輸出: [10]


解題思維:
首先掃過一次字串 s 來確認每種字母在 s 中最後出現(xiàn)的位置。

接著再掃過一次字串 s,而這次有另外兩個變數(shù) nowStart 和 nowEnd 的存在。前者代表當前這個部分應(yīng)該開始於的索引值(一開始為 0);後者則代表當前這個部分應(yīng)該結(jié)束於的索引值(一開始也是 0)。

直接來看一個例子,例如說範例 1 的 s = "ababcbacadefegdehijhklij"。可以看到:
a 最後出現(xiàn)於索引值 8、
b 最後出現(xiàn)於索引值 5、
c 最後出現(xiàn)於索引值 7、
d 最後出現(xiàn)於索引值 14、
e 最後出現(xiàn)於索引值 15、
f 最後出現(xiàn)於索引值 11、
g 最後出現(xiàn)於索引值 13、
h 最後出現(xiàn)於索引值 19、
i 最後出現(xiàn)於索引值 22、
j 最後出現(xiàn)於索引值 23、
k 最後出現(xiàn)於索引值 20、
l 最後出現(xiàn)於索引值 21、

一開始我們的 nowStart = nowEnd = 0。接著我們掃過字串 s:
"ababcbacadefegdehijhklij"
看到字母 a,而 a 最後出現(xiàn)於索引值 8。而因為現(xiàn)在我們位於第一個部分,所以現(xiàn)在這個 a 需要包含於這個部分之中,因此最後一個 a 最少也需要進來(不然會有其他部分出現(xiàn)字母 a,因此不符合題意)。
因此我們把 nowEnd 更新為 8(因為 8 > 0)。

"ababcbacadefegdehijhklij"
看到字母 b,而 b 最後出現(xiàn)於索引值 5
因此 nowEnd 保持不變(因為 5 < 8)。

"ababcbacadefegdehijhklij"
看到字母 a,而 a 最後出現(xiàn)於索引值 8
因此 nowEnd 保持不變(因為 8 = 8)。

"ababcbacadefegdehijhklij"
看到字母 b,而 b 最後出現(xiàn)於索引值 5
因此 nowEnd 保持不變(因為 5 < 8)。

"ababcbacadefegdehijhklij"
看到字母 c,而 c 最後出現(xiàn)於索引值 7
因此 nowEnd 保持不變(因為 7 < 8)。

"ababcbacadefegdehijhklij"
看到字母 b,而 b 最後出現(xiàn)於索引值 5
因此 nowEnd 保持不變(因為 5 < 8)。

"ababcbacadefegdehijhklij"
看到字母 a,而 a 最後出現(xiàn)於索引值 8
因此 nowEnd 保持不變(因為 8 = 8)。

"ababcbacadefegdehijhklij"
看到字母 c,而 c 最後出現(xiàn)於索引值 7
因此 nowEnd 保持不變(因為 7 < 8)。

"ababcbacadefegdehijhklij"
看到字母 a,而 a 最後出現(xiàn)於索引值 8
因此 nowEnd 保持不變(因為 8 = 8)。
而這邊則是一個分界點,因為當前索引值恰好也是 8。而由於 nowEnd 也是 8,因此前面看到的所有種類的字母(a 、 b 和 c)都可以容納進 s[0] ~ s[8] 這個部分之間。而為了讓分割中的部分數(shù)越多越好,所以我們得出了第一個部分的長度為 9。也因此下一個部分應(yīng)開始於 s[9],也就是我們需要將 nowStart 更新為 9。

"ababcbacadefegdehijhklij"
看到字母 d,而 d 最後出現(xiàn)於索引值 14
因此我們把 nowEnd 更新為 14(因為 14 > 8)。

"ababcbacadefegdehijhklij"
看到字母 e,而 e 最後出現(xiàn)於索引值 15
因此我們把 nowEnd 更新為 15(因為 15 > 14)。

"ababcbacadefegdehijhklij"
看到字母 f,而 f 最後出現(xiàn)於索引值 11
因此 nowEnd 保持不變(因為 11 < 15)。

"ababcbacadefegdehijhklij"
看到字母 e,而 e 最後出現(xiàn)於索引值 15
因此 nowEnd 保持不變(因為 15 = 15)。

"ababcbacadefegdehijhklij"
看到字母 g,而 g 最後出現(xiàn)於索引值 13
因此 nowEnd 保持不變(因為 13 < 15)。

"ababcbacadefegdehijhklij"
看到字母 d,而 d 最後出現(xiàn)於索引值 14
因此 nowEnd 保持不變(因為 14 < 15)。

"ababcbacadefegdehijhklij"
看到字母 e,而 e 最後出現(xiàn)於索引值 15
因此 nowEnd 保持不變(因為 15 = 15)。
與上同理,現(xiàn)在的索引值正好是 15,所以又是一個分界點。因此得出第二個部分的長度為 7。而下一部分應(yīng)開始於 s[16],因此 nowStart 應(yīng)更新為 16。

"ababcbacadefegdehijhklij"
看到字母 h,而 h 最後出現(xiàn)於索引值 19
因此我們把 nowEnd 更新為 19(因為 19 > 15)。

"ababcbacadefegdehijhklij"
看到字母 i,而 i 最後出現(xiàn)於索引值 22
因此我們把 nowEnd 更新為 22(因為 22 > 19)。

"ababcbacadefegdehijhklij"
看到字母 j,而 j 最後出現(xiàn)於索引值 23
因此我們把 nowEnd 更新為 23(因為 23 > 22)。

"ababcbacadefegdehijhklij"
看到字母 h,而 h 最後出現(xiàn)於索引值 19
因此 nowEnd 保持不變(因為 19 < 23)。

"ababcbacadefegdehijhklij"
看到字母 k,而 k 最後出現(xiàn)於索引值 20
因此 nowEnd 保持不變(因為 20 < 23)。

"ababcbacadefegdehijhklij"
看到字母 l,而 l 最後出現(xiàn)於索引值 21。
因此 nowEnd 保持不變(因為 21 < 23)。

"ababcbacadefegdehijhklij"
看到字母 i,而 i 最後出現(xiàn)於索引值 22
因此 nowEnd 保持不變(因為 22 < 23)。

"ababcbacadefegdehijhklij"
看到字母 j,而 j 最後出現(xiàn)於索引值 23
因此 nowEnd 保持不變(因為 23 = 23)。
現(xiàn)在的索引值正好是 15,又是一個分界點(同時也是最後的)。因此得出最後一部分長度為 8。

因此在上述過程中,我們可以知道範例 1 的答案為 [9,7,8]。而其他字串也可以照上面的方式來處理並得到所求。




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

創(chuàng)作回應(yīng)

更多創(chuàng)作