題目連結(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]。而其他字串也可以照上面的方式來處理並得到所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。