763 劃分字母區間(貪心 分析)

2021-10-10 03:37:10 字數 1430 閱讀 2986

1. 問題描述:

字串s由小寫字母組成。我們要把這個字串劃分為盡可能多的片段,同一字母最多出現在乙個片段中。返回乙個表示每個字串片段的長度的列表。

示例:

輸入:s = "ababcbacadefegdehijhklij"

輸出:[9,7,8]

解釋:劃分結果為 "ababcbaca", "defegde", "hijhklij"。

每個字母最多出現在乙個片段中。

像 "ababcbacadefegde", "hijhklij" 的劃分是錯誤的,因為劃分的片段數較少。

2. 思路分析:

① 一開始的時候沒有啥思路,於是看了一下力扣官方的**,使用pycharm進行debug除錯,發現其中的思路真的好棒,其中使用到了貪心的策略,下面是我自己的一些理解

② 因為同乙個字母只能夠出現在乙個片段中,所以對於當前的字母c,它的切割的位置一定在字母c最後一次出現的位置或者是這個位置更後面的位置,所以我們在一開始的時候就需要遍歷字串計算這些字母最後出現的位置,然後我們再遍歷一遍字串,檢查當前字母的位置是否包含了當前位置之前的所有字母最後出現的位置,如果包含了那麼在這個位置就可以劃分字串(貪心策略),如何判斷是否包含當前位置之前的出現的所有字母呢?我們需要宣告乙個變數來記錄到當前位置字母出現最晚的位置,假如當前遍歷的位置恰好等於了當前記錄的最晚的位置那麼就可以進行劃分了,其實畫出具體的圖會更好理解一點,而且畫出圖之後更好理解什麼時候應該對字串進行分割

③ 感覺有的時候根據題目的情況畫出具體的圖例會更有思路

3. **如下:

from typing import list

class solution:

def partitionlabels(self, s: str) -> list[int]:

last = [0] * 26

# 使用enumerate函式可以獲取對應的下標與值

for i, c in enumerate(s):

# 記錄每乙個字元最後一次出現的位置

last[ord(c) - ord("a")] = i

start, end = 0, 0

res = list()

for i, c in enumerate(s):

# 記錄到當前位置字母最晚出現的位置

t = last[ord(c) - ord("a")]

end = max(end, t)

if i == end:

start = i + 1

return res

763 劃分字母區間

字串 s 由小寫字母組成。我們要把這個字串劃分為盡可能多的片段,同乙個字母只會出現在其中的乙個片段。返回乙個表示每個字串片段的長度的列表。示例 1 輸入 s ababcbacadefegdehijhklij 輸出 9,7,8 解釋 劃分結果為 ababcbaca defegde hijhklij 每...

763 劃分字母區間

示例 1 輸入 s ababcbacadefegdehijhklij 輸出 9,7,8 解釋 劃分結果為 ababcbaca defegde hijhklij 每個字母最多出現在乙個片段中。像 ababcbacadefegde hijhklij 的劃分是錯誤的,因為劃分的片段數較少。注意 s的長度在...

763 劃分字母區間

題目描述 字串 s 由小寫字母組成。我們要把這個字串劃分為盡可能多的片段,同乙個字母只會出現在其中的乙個片段。返回乙個表示每個字串片段的長度的列表。示例 1 輸入 s ababcbacadefegdehijhklij 輸出 9,7,8 解釋 劃分結果為 ababcbaca defegde hijhk...