日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

763. Partition Labels 划分字母区间

發(fā)布時間:2024/5/17 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 763. Partition Labels 划分字母区间 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
字符串 S 由小寫字母組成。我們要把這個字符串劃分為盡可能多的片段,同一個字母只會出現(xiàn)在其中的一個片段。返回一個表示每個字符串片段的長度的列表。

 

示例 1:

輸入:S = "ababcbacadefegdehijhklij" 輸出:[9,7,8] 解釋: 劃分結(jié)果為 "ababcbaca", "defegde", "hijhklij"。 每個字母最多出現(xiàn)在一個片段中。 像 "ababcbacadefegde", "hijhklij" 的劃分是錯誤的,因為劃分的片段數(shù)較少。

 

提示:

  • S的長度在[1, 500]之間。
  • S只包含小寫字母 'a' 到 'z' 。
">

字符串 S 由小寫字母組成。我們要把這個字符串劃分為盡可能多的片段,同一個字母只會出現(xiàn)在其中的一個片段。返回一個表示每個字符串片段的長度的列表。

?

示例 1:

輸入:S = "ababcbacadefegdehijhklij" 輸出:[9,7,8] 解釋: 劃分結(jié)果為 "ababcbaca", "defegde", "hijhklij"。 每個字母最多出現(xiàn)在一個片段中。 像 "ababcbacadefegde", "hijhklij" 的劃分是錯誤的,因為劃分的片段數(shù)較少。

?

提示:

  • S的長度在[1, 500]之間。
  • S只包含小寫字母 'a' 到 'z' 。

貪心算法 + 雙指針

由于同一個字母只能出現(xiàn)在同一個片段,顯然同一個字母的第一次出現(xiàn)的下標位置和最后一次出現(xiàn)的下標位置必須出現(xiàn)在同一個片段。因此需要遍歷字符串,得到每個字母最后一次出現(xiàn)的下標位置。

在得到每個字母最后一次出現(xiàn)的下標位置之后,可以使用貪心算法和雙指針的方法將字符串劃分為盡可能多的片段,具體做法如下。

  • 從左到右遍歷字符串,遍歷的同時維護當前片段的開始下標 start\textit{start}start 和結(jié)束下標 end\textit{end}end,初始時 start=end=0\textit{start}=\textit{end}=0start=end=0

  • 對于每個訪問到的字母 ccc,得到當前字母的最后一次出現(xiàn)的下標位置 endc\textit{end}_cendc?,則當前片段的結(jié)束下標一定不會小于 endc\textit{end}_cendc?,因此令 end=max?(end,endc)\textit{end}=\max(\textit{end},\textit{end}_c)end=max(end,endc?)

  • 當訪問到下標 end\textit{end}end 時,當前片段訪問結(jié)束,當前片段的下標范圍是 [start,end][\textit{start},\textit{end}][start,end],長度為 end?start+1\textit{end}-\textit{start}+1end?start+1,將當前片段的長度添加到返回值,然后令 start=end+1\textit{start}=\textit{end}+1start=end+1,繼續(xù)尋找下一個片段。

  • 重復上述過程,直到遍歷完字符串。

上述做法使用貪心的思想尋找每個片段可能的最小結(jié)束下標,因此可以保證每個片段的長度一定是符合要求的最短長度,如果取更短的片段,則一定會出現(xiàn)同一個字母出現(xiàn)在多個片段中的情況。由于每次取的片段都是符合要求的最短的片段,因此得到的片段數(shù)也是最多的。

由于每個片段訪問結(jié)束的標志是訪問到下標 end\textit{end}end,因此對于每個片段,可以保證當前片段中的每個字母都一定在當前片段中,不可能出現(xiàn)在其他片段,可以保證同一個字母只會出現(xiàn)在同一個片段。

Code

from typing import Listclass Solution:def partitionLabels(self, S: str) -> List[int]:last = [0 for _ in range(26)]for i, ch in enumerate(S):last[ord(ch) - ord('a')] = ipartition = list()start = end = 0for i, ch in enumerate(S):end = max(end, last[ord(ch) - ord('a')])if i == end:partition.append(end - start + 1)start = end + 1return partition

復雜度分析

  • 時間復雜度:O(n)O(n)O(n),其中 nnn 是字符串的長度。需要遍歷字符串兩次,第一次遍歷時記錄每個字母最后一次出現(xiàn)的下標位置,第二次遍歷時進行字符串的劃分。

  • 空間復雜度:O(Σ)O(\Sigma)O(Σ),其中 Σ\SigmaΣ 是字符串中的字符集大小。這道題中,字符串只包含小寫字母,因此 Σ=26\Sigma=26Σ=26

總結(jié)

以上是生活随笔為你收集整理的763. Partition Labels 划分字母区间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。