第六天——貪心算法——字符串分隔

1. 題目

給定一個字符串 s,我們需要將其劃分為盡可能多的部分,使得同一字母最多出現在一個部分中。

例如:字符串 "ababcc" 可以劃分為 ["abab", "cc"],但要避免 ["aba", "bcc"] 或 ["ab", "ab", "cc"] 這樣的劃分方式(因為它們包含了同一個字母出現在多個部分的情況)。

注意:劃分后的部分順序必須與原字符串順序一致,所有部分拼接起來仍然等于 s。
返回:這些部分的長度組成的列表。

2.?分析

這道題目是一個典型的貪心算法問題,解法類似于區間合并問題

關鍵思路

  1. 記錄每個字母的最遠出現位置
    • 用?last_occurrence?字典保存每個字符在字符串?s?中最后出現的位置(即最右邊的索引),這樣可以確定該字符所屬的最小子串范圍。
  2. 滑動窗口遍歷,確定當前部分的結束點
    • 用?start?和?end?表示當前部分的起始和結束位置。
    • 遍歷字符串時,不斷更新?end,使其變為已遍歷字符的最遠出現位置。
    • 當?i == end?時,說明當前部分可以切分,記錄長度,并更新?start?到?end + 1

3. 完整代碼

def partition_labels(s):last_occurrence = {char: idx for idx, char in enumerate(s)}  # 記錄每個字母的最后出現位置start = end = 0result = []for i, char in enumerate(s):end = max(end, last_occurrence[char])  # 更新當前部分的結束點if i == end:  # 找到一個符合條件的部分result.append(end - start + 1)start = end + 1  # 更新下一部分的起始點return result
print(partition_labels("ababcc"))

示例分析:s = "ababcc"

  1. last_occurrence = {'a': 2, 'b': 3, 'c': 5}
  2. 遍歷過程:
    • i = 0,?char = 'a',?end = max(0, 2) = 2
    • i = 1,?char = 'b',?end = max(2, 3) = 3
    • i = 2,?char = 'a'(滿足?i == end = 2),記錄長度?2 - 0 + 1 = 3"aba")??
    • (這里需要更正!i = 2?時的?end = 3,不等于?i,不會觸發?append。)
    • i = 3,?char = 'b'(滿足?i == end = 3),記錄長度?3 - 0 + 1 = 4"abab"
    • i = 4,?char = 'c',?end = max(3, 5) = 5
    • i = 5,?char = 'c'(滿足?i == end = 5),記錄長度?5 - 4 + 1 = 2"cc"
  3. 最終結果:?[4, 2]["abab", "cc"])?

partition_labels 算法中,end 表示當前部分的最遠結束位置。為了保證同一字符僅出現在一個部分里,我們需要確保其所有出現的范圍都能被當前部分完全覆蓋max(end, last_occurrence[char]) 的作用是不斷擴展當前部分的右邊界,以確保:當前字符的所有出現都被覆蓋,后續字符不會跨越當前部分。

s = "ababcc" 為例:

字符?charlast_occurrence[char]end(更新前)new_end = max(end, last)操作
'a'?(i=0)20max(0, 2) = 2end=2
'b'?(i=1)32max(2, 3) = 3end=3
'a'?(i=2)23max(3, 2) = 3end=3
'b'?(i=3)33max(3, 3) = 3觸發分割
'c'?(i=4)53max(3, 5) = 5end=5
'c'?(i=5)55max(5, 5) = 5觸發分割

i == end 時,觸發分隔的原因:

說明:當前部分的所有字符已經處理完畢,

  • 已經遍歷到?i = end,且在這個位置之前的所有字符的最遠出現位置?last_occurrence[char]?都 ≤?end(因為?end?是由?max(last_occurrence[char])?決定的)。
  • 換句話說,這個部分已經囊括了所有必須包含的字符(同一字母的所有出現都被包含在當前部分)。

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

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

相關文章

[原創](現代Delphi 12指南):[macOS 64bit App開發]: 注意“回車換行“的跨平臺使用.

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、…

Maven 插件參數注入與Mojo開發詳解

🧑 博主簡介:CSDN博客專家,歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/?__c1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,精通Java編…

擴增子分析|R分析之微生物生態網絡穩定性評估之節點和連接的恒常性、節點持久性以及組成穩定性指數計算

一、引言 周集中老師團隊于2021年在Nature climate change發表的文章,闡述了網絡穩定性評估的原理算法,并提供了完整的代碼。自此對微生物生態網絡的評估具有更全面的指標,自此網絡穩定性的評估廣受大家歡迎。本文將介紹網絡穩定性之節點和連…

人體肢體渲染-一步幾個腳印從頭設計數字生命——仙盟創夢IDE

人體肢體動作數據集-太極拳 渲染代碼 # 初始化Pygame pygame.init()# 設置窗口尺寸 WINDOW_WIDTH 800 WINDOW_HEIGHT 600 window pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption("動作回放")# 設置幀率 FPS 30 clock pyg…

強化學習入門:馬爾科夫獎勵過程

文章目錄 前言1、組成部分2、應用例子3、馬爾科夫獎勵過程總結 前言 最近想開一個關于強化學習專欄,因為DeepSeek-R1很火,但本人對于LLM連門都沒入。因此,只是記錄一些類似的讀書筆記,內容不深,大多數只是一些概念的東…

騰訊開源實時語音大模型VITA-audio,92mstoken極速響應,支持多語言~

簡介 VITA-Audio 是一個由騰訊優圖實驗室(Tencent Youtu Lab)、南京大學和廈門大學的研究人員共同開發的項目,旨在解決現有語音模型在流式生成(streaming)場景下生成第一個音頻令牌(token)時的高…

測序的原理

Sanger 測序原理 https://v.qq.com/x/page/d0124c0k44t.html illumina 測序原理: https://v.qq.com/x/page/i0770fd7r9i.html PacBio 第三代 SMRT 單分子測序 https://v.qq.com/x/page/r03534cry7u.html Ion torrent 測序原理 https://v.qq.com/x/page/v01754s6r82.…

高項-邏輯數據模型

邏輯數據模型的核心理解 1. 定義與特點 邏輯數據模型(Logical Data Model, LDM): 是一種抽象的數據結構設計,用于描述業務實體(如客戶、訂單)及其關系(如“客戶下單”)&#xff0c…

《數字分身進化論:React Native與Flutter如何打造沉浸式虛擬形象編輯》

React Native,依托JavaScript語言,借助其成熟的React生態系統,開發者能夠快速上手,將前端開發的經驗巧妙運用到移動應用開發中。它通過JavaScript橋接機制調用原生組件,實現與iOS和Android系統的深度交互,這…

提高繩牽引并聯連續體機器人運動學建模精度的基于Transformer的分段學習方法

合肥工業大學王正雨老師團隊針對繩牽引并聯連續體機器人的運動學建模提出一種基于Transformer網絡的分段學習方法,該方法較傳統建模性能卓越、精度更高。相關研究論文“Transformer-based segmented learning for kinematics modelling of a cable-driven parallel …

【PX4飛控】在 Matlab Simulink 中使用 Mavlink 協議與 PX4 飛行器進行交互

這里列舉一些從官網收集的比較有趣或者實用的功能。 編寫 m 腳本與飛行器建立 UDP 連接,并實時可視化 Mavlink 消息內容,或者讀取腳本離線分析數據。不光能顯示 GPS 位置或者姿態等信息的時間曲線,可以利用 Matlab Plot 功能快速定制化顯示一…

Oracle中的select1條、幾條、指定范圍的語句

在Oracle中,可以使用不同的方法來選擇一條記錄、多條記錄或指定范圍內的記錄。以下是具體的實現方式: 1. 查詢單條記錄 使用ROWNUM偽列限制結果為1條: SELECT * FROM your_table WHERE ROWNUM 1;特點:Oracle會在結果集生成時分…

自營交易考試為何出圈?一場模擬交易背后的真實競爭

在交易圈里,有個現象正在悄悄發生:越來越多交易員開始主動報名參與一類“非實盤”的考試,原因卻并不復雜。不是為了資格證書,也不是為了炫技,而是為了一個更實在的東西——穩定、透明的利潤分成,以及一次向…

一鍵生成達夢、Oracle、MySQL 數據庫 ER 圖!解鎖高效數據庫設計!

從事企業軟件項目開發的同學們一定對 ER 圖很熟悉,可以幫助用戶快速厘清數據庫結構,方便后續維護和優化。但是在日常工作中,面對復雜的數據結構,整理表設計文檔對于每一位DBA來說都很頭大,需要將設計細節轉化為條理清晰…

游戲行業DDoS攻擊類型及防御分析

游戲行業作為DDoS攻擊的高發領域,攻擊類型復雜多樣,結合多個來源的信息,以下是其主要攻擊類型及特征分析: 1. 傳統流量型DDoS攻擊 UDP洪水攻擊:通過大量UDP報文淹沒服務器端口,消耗帶寬資源,導…

Web 架構之狀態碼全解

文章目錄 一、引言二、狀態碼分類2.1 1xx 信息性狀態碼2.2 2xx 成功狀態碼200 OK201 Created204 No Content 2.3 3xx 重定向狀態碼301 Moved Permanently302 Found304 Not Modified 2.4 4xx 客戶端錯誤狀態碼400 Bad Request401 Unauthorized403 Forbidden404 Not Found 2.5 5x…

jedis+redis pipeline詭異的鏈接損壞、數據讀取異常問題解決

文章目錄 問題現象棧溢出(不斷的重連)讀取超時未知響應嘗試讀取損壞的鏈接讀取到的數據和自己要讀的無關,導致空指針、類型轉換錯誤,數據讀取錯亂 問題寫法問題分析修復注意點 問題現象 棧溢出(不斷的重連&#xff09…

c++STL-list的模擬實現

cSTL-list的模擬實現 list源碼剖析list模擬實現list構造函數拷貝構造函數賦值重載迭代器 iterator訪問結點數size和判空尾插 push_back頭插 push_front尾刪pop_back頭刪pop_front插入 insert刪除 erase清空clear和析構函數訪問結點 參考程序 list源碼剖析 建議先看cSTL-list的…

WeakAuras Lua Script ICC (BarneyICC)

WeakAuras Lua Script ICC (BarneyICC) https://wago.io/BarneyICC/69 全量英文字符串: !WA:2!S33c4TXX5bQv0kobjnnMowYw2YAnDKmPnjnb4ljzl7sqcscl(YaG6HvCbxaSG7AcU76Dxis6uLlHNBIAtBtRCVM00Rnj8Y1M426ZH9XDxstsRDR)UMVCTt0DTzVhTjNASIDAU…

校園網規劃與設計方案

一、項目概述 校園網是學校實現信息化教學、科研與管理的重要基礎設施,其性能與穩定性直接影響學校的整體發展。隨著學校規模不斷擴大、教學科研活動日益豐富,對校園網的帶寬、可靠性、安全性以及智能化管理等方面提出了更高要求。本規劃與設計方案旨在構建一個高速、穩定、…