貪心算法題解——劃分字母區間【LeetCode】

763. 劃分字母區間

本題目,“同一字母最多出現在一個片段中”,因為這句話,所以本質上

這道題目屬于合并區間


一、算法邏輯(逐步思路)

? 目標:

將字符串 s 劃分成盡可能多的片段,要求:

  • 每個字母最多只出現在一個片段中;
  • 所有片段拼接后仍是原始字符串;
  • 返回每個片段的長度。

? 實現邏輯:

  1. 先預處理:
    • 用字典 last 記錄字符串中每個字母最后一次出現的位置
    • 例如:s = "ababcbacadefegdehijhklij",其中 'a' 最后出現在 8,'e' 出現在 15,等等。
  1. 開始遍歷劃分:
    • 初始化兩個指針:start 表示當前片段的起點,end 表示當前片段的最遠右端;
    • 遍歷字符串:
      • 對每個字符 c,更新當前片段的 endmax(end, last[c])
      • 如果當前位置 i == end,說明這個片段封閉了(它包含了所有出現在其中字符的最后位置):
        • 計算這個片段的長度為 end - start + 1
        • 把它加入答案;
        • 然后更新 start = i + 1,準備開始下一個片段。

二、算法核心點

? 核心思想:貪心策略 + 動態區間合并

  • 核心貪心策略是:
    • 對于當前片段內出現的所有字母,都要等它們“最后一次出現”后,才可以結束這個片段;
    • 所以,我們用 end 表示當前片段中所有字符的最遠結束點
    • 一旦遍歷指針 i 到達 end,說明這個片段所有相關字符都封閉了,可以切一刀。
  • 這個過程貪心的地方在于:
    • 每次劃分盡可能早地結束當前片段(在剛好滿足“所有字符都只出現在一個片段”的條件下),從而得到更多的片段。
class Solution:def partitionLabels(self, s: str) -> List[int]:last = {c: i for i, c in enumerate(s)}  # 每個字母最后出現的下標ans = []start = end = 0for i, c in enumerate(s):end = max(end, last[c])  # 更新當前區間右端點的最大值if end == i:  # 當前區間合并完畢ans.append(end - start + 1)  # 區間長度加入答案start = i + 1  # 下一個區間的左端點return ans

三、復雜度分析

  • 時間復雜度:O(n)
    • 第一次遍歷構造 last:O(n);
    • 第二次遍歷劃分字符串:O(n);
    • 總共是線性時間復雜度。
  • 空間復雜度:O(1)(常數級)
    • 雖然用了一個字典 last,但它最多存 26 個小寫字母,屬于常數空間。

? 總結表:

維度

內容

? 思路邏輯

利用每個字符最后出現位置,動態維護區間右邊界,貪心切片

? 核心技巧

貪心:延遲切片直到當前片段中所有字母的最后出現位置都包含為止

? 時間復雜度

O(n),兩次遍歷字符串

? 空間復雜度

O(1),字母表大小固定,最多用 26 個鍵值對

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88605.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python----目標檢測(使用YOLOV8網絡訓練人臉)

一、Ultralytics安裝 網址:主頁 -Ultralytics YOLO 文檔 Ultralytics提供了各種安裝方法,包括pip、conda和Docker。通過 ultralytics pip包安裝最新穩定版本的YOLOv8,或克隆Ultralytics GitHub 存儲庫以獲取最新版本。可以使用Docker在隔離的…

Filament引擎(三) ——引擎渲染流程

通過Filament引擎(二) ——引擎的調用及接口層核心對象的介紹我們知道,要在項目中使用filament,首先我們需要構建出filament的Engine的對象,然后通過filament::Engine對象實例,來構建其他對象,組裝渲染場景&#xff0c…

Oracle存儲過程導出數據到Excel:全面實現方案詳解

技術背景與需求分析 數據導出是企業級應用的核心功能,Oracle存儲過程因其高性能執行(減少網絡傳輸)、代碼復用性(封裝業務邏輯)和事務安全性(ACID保障)成為理想載體。Excel作為使用率$ \geq 95% $的辦公工具,其兼容性需求尤為突出。典型場景包括: 財務報表自動生成物…

解決el-table右下角被擋住部分

一部分展示不全&#xff0c;被遮擋&#xff0c;因為 最右邊加了fixed"right"<el-table-column fixed"right" label"操作" width"120">解決&#xff1a;1、去除fixed"right"或2、設置樣式單頁面<style lang"sc…

Waiting for server response 和 Content Download

在瀏覽器網絡調試&#xff08;如 Chrome DevTools 的 Network 面板&#xff09;中&#xff0c;Timing 選項卡下的 Waiting for server response 和 Content Download 是兩個關鍵性能指標&#xff0c;它們分別代表了 HTTP 請求生命周期的不同階段。以下是詳細解釋和優化方案&…

《Java Web程序設計》實驗報告五 Java Script學習匯報

目 錄 一、實驗目的 二、實驗環境 三、實驗步驟和內容 1、小組成員分工&#xff08;共計4人&#xff09; 2、實驗方案 3、實驗結果與分析 Ⅰ、簡述JavaScript的產生過程與Java的關系 Ⅱ、簡述JavaScript的特點有哪些 Ⅲ、簡述ECMAScript的歷史 Ⅳ、簡述ECMAScript與J…

C#與FX5U進行Socket通信

實現效果實現步驟&#xff1a;注意&#xff1a;詳細的參數這里就不說明了&#xff0c;自己網上搜即可&#xff1b;打開GX Works3 創建FX5U項目系統參數設置PLC的具體型號&#xff08;我有實物PLC&#xff09;設置IP及組態參數添加通訊設備&#xff08;這里PLC做客戶端&#xff…

ubuntu20.04基于tensorRT和c++跑yolo11

設備 系統&#xff1a;Ubuntu 20.04 顯卡&#xff1a;NVIDIA GeForce RTX 3050 顯卡驅動&#xff1a; Driver Version: 535.183.01 CUDA Version: 12.2 關鍵軟件版本總結 Cmake: 3.28.6 Cuda&#xff1a; 12.2.2 Cudnn: 8.9.7 TensorRT: 10.8.0.43 Python&#xff1a;3.10.1…

玖玖NFT數字藏品源碼(源碼下載)

玖玖NFT數字藏品源碼 這套還是很不錯的&#xff0c;前端uniapp&#xff0c;后端FastAdmin&#xff0c;對接匯元支付&#xff0c;富友支付&#xff0c;對接avata鏈&#xff0c;感興趣的自行下載研究 源碼下載&#xff1a;https://download.csdn.net/download/m0_66047725/9133…

【Redis-05】高可用方案-主從哨兵

1 概述 高可用&#xff08;High Availability&#xff09;指系統在部分節點故障時仍能持續提供服務的能力。Redis 作為核心緩存組件&#xff0c;主流的高可用方案有主從復制、哨兵模式、集群模式三種。本文介紹主從復制、哨兵模式兩種高可用方案。 2 主從復制 通過 “一主多從”…

焊接機器人智能節氣裝置

工業焊接作為現代制造業的重要組成部分&#xff0c;廣泛應用于汽車、航空航天、建筑、船舶等多個領域。隨著自動化技術的快速發展&#xff0c;焊接機器人已成為提升焊接效率和質量的關鍵裝備。在傳統焊接及部分自動化焊接過程中&#xff0c;氣體流失問題仍然普遍存在&#xff0…

【6.1.0 漫畫數據庫技術選型】

漫畫數據庫技術選型 &#x1f3af; 學習目標&#xff1a;掌握架構師核心技能——數據庫技術選型&#xff0c;針對不同業務場景選擇最合適的數據庫方案 &#x1f3db;? 第一章&#xff1a;關系型數據庫對比選型 &#x1f914; MySQL vs PostgreSQL vs TiDB 想象數據庫就像不同…

CVE-2022-4262/CVE-2022-3038

CVE-2022-4262&#xff08;Linux內核UAF漏洞&#xff09;漏洞原理CVE-2022-4262是Linux內核中RDS&#xff08;Reliable Datagram Sockets&#xff09;協議實現的一個UAF&#xff08;Use-After-Free&#xff0c;釋放后使用&#xff09;漏洞。具體來說&#xff1a;在rds_rdma_ext…

[Token]Token merging for Vision Generation

Token Compression for Vision Domain_Generation 文章目錄Image GenerationToken Merging for Fast Stable Diffusion, CVPRW 2023.Token Fusion: Bridging the Gap between Token Pruning and Token Merging, WACV 2024ToDo: Token Downsampling for Efficient Generation of…

React封裝過哪些組件-下拉選擇器和彈窗表單

背景&#xff08;S - Situation&#xff09;&#xff1a;在某活動管理系統中&#xff0c;前端頁面需要支持用戶選擇“要配置的當前活動”&#xff0c;并提供「新增」「編輯」功能&#xff0c;操作內容包括填寫活動名稱、ID、版本號等字段。原始實現邏輯分散、復用性差&#xff…

多租戶架構下的多線程處理實踐指南

在現代 SaaS 系統中&#xff0c;多租戶架構&#xff08;Multi-Tenant Architecture&#xff09;已成為主流。然而&#xff0c;隨著系統性能要求的提升和業務復雜度的增加&#xff0c;多線程成為不可避免的技術手段。但在多租戶環境下使用多線程&#xff0c;容易引發數據錯亂、租…

MyBatis插件機制揭秘:從攔截器開發到分頁插件實戰

一、攔截器體系架構解析 1.1 責任鏈模式在MyBatis中的實現 MyBatis通過動態代理技術構建攔截器鏈&#xff0c;每個插件相當于一個切面&#xff1a; // 攔截器鏈構建過程 public class InterceptorChain {private final List<Interceptor> interceptors new ArrayList<…

百度文心一言開源ERNIE-4.5深度測評報告:技術架構解讀與性能對比

目錄一、技術架構解讀1.1、ERNIE 4.5 系列模型概覽1.2、模型架構解讀1.2.1、異構MoE&#xff08;Heterogeneous MoE&#xff09;1.2.2、視覺編碼器&#xff08;Vision Encoder&#xff09;1.2.3、適配器&#xff08;Adapter&#xff09;1.2.4、多模態位置嵌入&#xff08;Multi…

Matplotlib 模塊入門

Python 中有個非常實用的可視化庫 ——Matplotlib。數據可視化是數據分析中不可或缺的環節&#xff0c;而 Matplotlib 作為 Python 的 2D 繪圖庫&#xff0c;能幫助我們生成高質量的圖表&#xff0c;讓數據更直觀、更有說服力。接下來&#xff0c;我們將從 Matplotlib 的概述、…

LeetCode 3169.無需開會的工作日:排序+一次遍歷——不需要正難則反,因為正著根本不難

【LetMeFly】3169.無需開會的工作日&#xff1a;排序一次遍歷——不需要正難則反&#xff0c;因為正著根本不難 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-days-without-meetings/ 給你一個正整數 days&#xff0c;表示員工可工作的總天數&#xff08;從第…