LeetCode 3090.每個字符最多出現兩次的最長子字符串

題目鏈接

https://leetcode.cn/problems/maximum-length-substring-with-two-occurrences/

題目描述

給定一個字符串 s,找出滿足每個字符最多出現兩次的最長子字符串,并返回其長度。

示例

  • 輸入:s = "aabba"
    • 輸出:5
    • 解釋:子字符串 "aabba" 中每個字符(ab)最多出現兩次,且長度為 5。
  • 輸入:s = "aaaa"
    • 輸出:2
    • 解釋:最長子字符串為 "aa",每個字符最多出現兩次。

解法分析:滑動窗口 + 數組計數

核心思路

本題采用滑動窗口算法,通過左右指針維護一個有效區間,確保區間內每個字符的出現次數不超過 2 次。同時,利用長度固定的數組記錄字符出現的頻率,實現高效的計數與判斷。

代碼實現

class Solution:def maximumLengthSubstring(self, s: str) -> int:# 使用長度26的數組記錄小寫字母出現次數(假設輸入僅包含小寫字母)count = [0] * 26ans = left = 0for right in range(len(s)):# 計算當前字符的索引(a=0, b=1,...z=25)idx = ord(s[right]) - ord('a')count[idx] += 1  # 右指針字符計數+1# 當字符出現次數>2時,移動左指針收縮窗口while count[idx] > 2:left_idx = ord(s[left]) - ord('a')count[left_idx] -= 1  # 左指針字符計數-1left += 1            # 左指針右移# 更新最大窗口長度ans = max(ans, right - left + 1)return ans

關鍵邏輯解析

  1. 初始化

    • count:長度為 26 的數組,用于記錄小寫字母的出現次數,假設輸入僅包含小寫字母。數組下標 0 對應字符 a1 對應 b,以此類推。
    • ans:記錄滿足條件的最長子字符串長度,初始值為 0。
    • left:滑動窗口的左指針,初始值為 0。
  2. 右指針擴展

    • 使用 right 從左到右遍歷字符串 s
    • 通過 ord(s[right]) - ord('a') 將字符轉換為數組索引,對 count 數組中對應位置的計數加 1,表示當前字符出現次數增加。
  3. 左指針收縮

    • count[idx] > 2 時,說明當前字符在窗口內出現次數超過 2 次,需要收縮窗口。
    • 通過 ord(s[left]) - ord('a') 計算左指針指向字符的索引,將其在 count 數組中的計數減 1。
    • 左指針 left 右移一位,縮小窗口范圍,直到當前字符出現次數不超過 2 次。
  4. 更新結果

    • 每次循環中,計算當前窗口的長度 right - left + 1,并與 ans 比較,取較大值更新 ans
    • 最終返回 ans,即滿足條件的最長子字符串長度。

復雜度分析

  • 時間復雜度 O ( n ) O(n) O(n),其中 n n n 是字符串 s 的長度。左右指針最多各遍歷字符串一次,每個字符最多被處理兩次。
  • 空間復雜度 O ( 1 ) O(1) O(1),數組 count 的長度固定為 26,與輸入字符串的長度無關。

優化點與注意事項

  1. 數組替代字典:使用固定長度的數組替代字典記錄字符頻率,避免哈希計算開銷,在字符集固定(如小寫字母)的場景下更高效。
  2. 字符集假設:當前代碼假設輸入僅包含小寫字母,若字符集擴展(如包含大寫字母、數字等),需要擴展數組長度或改用字典存儲。
  3. 邊界條件:代碼默認輸入字符串非空,題目保證 s.length ≥ 2,因此無需額外處理空字符串。

總結

本解法通過滑動窗口和數組計數的結合,在 O ( n ) O(n) O(n) 時間復雜度和 O ( 1 ) O(1) O(1) 空間復雜度內高效解決問題。其核心在于利用雙指針動態維護有效區間,并通過數組快速判斷字符出現頻率。該思路可作為處理字符頻率約束類問題的通用模板,適用于更多變種題型(如每個字符最多出現 k 次)。

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

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

相關文章

使用開源NVIDIA cuOpt加速決策優化

使用開源NVIDIA cuOpt加速決策優化 文章目錄 使用開源NVIDIA cuOpt加速決策優化決策優化的現實挑戰供應鏈優化的復雜性實時決策的挑戰計算復雜性的挑戰 NVIDIA cuOpt:GPU加速的決策優化解決方案cuOpt的核心技術架構支持的優化問題類型性能優勢分析 實際應用案例&…

【JVM 09-垃圾回收】

垃圾回收 筆記記錄 1. 如何判斷對象可以回收1.1 引用計數法1.1.1 缺點 1.2 可達性分析算法1.2.1 可達分析、根對象1.2.2 優缺點 1.3 四種引用(強軟弱虛)1.3.1 軟引用的實際使用案例1.3.2 軟引用-引用隊列1.3.3 弱引用的實際使用案例 2. 垃圾回收算法2.1 標記清除算法2.2 標記整…

《二叉搜索樹》

引言: 上次我們結束了類和對象的收尾,之后我們就要學習一些高級的數據結構,今天我們先來看一個數據結構-- 二叉搜索樹。 一: 二叉搜索樹的概念(性質) 二叉搜索樹又稱二叉排序樹,它或者是一棵空樹,或者是…

【Redis】Sentinel哨兵

🛡? 深入理解 Redis Sentinel:高可用架構的守護者 在實際開發中,我們常用 Redis 構建緩存系統或數據中間件。然而,主從復制雖然能實現數據同步,但無法自動故障轉移(failover),這就…

Shell腳本應用及實戰演練

文章目錄 一、Shell腳本語言的基本結構1、Shell腳本的用途:2、 Shell腳本基本結構:3、 創建Shell腳本過程4、 腳本注釋規范 二、Shell腳本語言的變量用法詳解位置與預定義變量 三、 Shell字符串詳解1、Shell字符串拼接2、Shell字符串截取3、 Shell的格式…

軟件工程瀑布模型學習指南

軟件工程瀑布模型學習指南 一、瀑布模型核心概念 1.1 定義與特點 瀑布模型是一種經典的軟件開發流程,將項目劃分為順序性的階段,每個階段有明確的輸入和輸出,如同瀑布流水般單向推進。其特點包括: 階段間具有明確的順序性和依賴性強調文檔驅動和階段評審適合需求明確、穩…

獲取gitlab上項目分支版本(二)

獲取gitlab上項目分支版本_gitlab代碼分支版本在哪-CSDN博客 原先寫過一版,但是這次想更新一下項目的分支信息時,提示我 git服務器上的Python版本是2.7.3,這個錯誤表明當前Python環境中沒有安裝requests庫,服務器也沒有連接外網&…

主流防火墻策略繞過漏洞的修復方案與加固實踐

主流防火墻策略繞過漏洞的修復方案與加固實踐 流量關鍵點分析(攻擊手法) 攻擊者通過精心構造的TCP序列號攻擊和惡意標志組合繞過防火墻DPI檢測,核心手法如下: TCP連接建立(正常握手) 1049:客戶…

泛微OAe9-后端二開常見數據庫操作

泛微OAe9-后端二開常見數據庫操作 文章目錄 泛微OAe9-后端二開常見數據庫操作一、RecordSet1 RecordSet 操作OA本身的表2 RecordSet 操作OA 本身的存儲過程 二、RecordSetTrans三、RecordSetDataSource四、原生 jdbc 一、RecordSet RecordSet 適用于操作 OA 自己的庫。OA 數據庫…

【數據分析八:hypothesis testing】假設檢驗

本節我們講述假設檢驗和抽樣方法 有關假設檢驗的詳細內容,可以參考我以往的博客 概率論與數理統計總復習_概率論與數理統計復習-CSDN博客文章瀏覽閱讀1.5k次,點贊33次,收藏23次。中科大使用的教輔《概率論和數理統計》,帶大家復…

AI免費工具:promptpilot、今天學點啥、中英文翻譯

promptpilot 激發模型潛能,輕松優化 Prompt https://promptpilot.volcengine.com/startup 今天學點啥 https://metaso.cn/study 能生成網頁和語音播報 中英文翻譯 沉浸式翻譯,瀏覽器插件,ai翻譯

計算機網絡學習筆記:TCP三報文握手、四報文揮手

文章目錄 前言一、TCP三報文握手二、TCP四報文揮手三、TCP保活計時器 前言 TCP通信,通常需要經歷三個階段:三報文握手->發送,接收數據->四報文揮手。 一、TCP三報文握手 三報文握手處于TCP的連接建立階段,主要解決了以下的…

kafka部署和基本操作

一、部署kafka 解壓 tar xzvf kafka_2.12-3.9.1.tgz tar -zxf kafka_2.12-3.9.1.tgz 1.修改config/server.properties # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # …

Bootstrap 5學習教程,從入門到精通,Bootstrap 5 導航語法知識點及案例代碼(17)

Bootstrap 5 導航語法知識點及案例代碼 Bootstrap 5 提供了強大的導航組件,幫助開發者快速構建響應式且美觀的導航欄。 一、Bootstrap 5 導航組件概述 Bootstrap 5 提供了多種導航組件,主要包括: 導航欄(Navbar)&am…

清除 docker 無用的 鏡像/容器

清除 docker 無用的 鏡像/容器 刪除 <none> 的 docker 鏡像 使用以下命令刪除所有 的 Docker 鏡像&#xff08;即懸空鏡像 / dangling images&#xff09;&#xff1a; docker image prune -f這會自動刪除所有沒有 tag 的鏡像&#xff08;&#xff09;&#xff0c;不會…

使用Charles抓包工具提升API調試與性能優化效率

在軟件開發過程中&#xff0c;網絡請求調試和性能優化往往成為開發者遇到的挑戰&#xff0c;尤其是在進行API接口調試時。開發者需要確保網絡請求的正確性、響應時間以及系統的整體性能。然而&#xff0c;傳統的調試方法常常無法提供足夠的細節來深入分析問題&#xff0c;進而影…

如何協調各項目關鍵節點的沖突與依賴

在多項目并行的環境下&#xff0c;關鍵節點間的沖突與依賴是導致項目延期、資源浪費和溝通誤解的主要根源。要高效協調此類問題&#xff0c;企業應重點從建立透明的進度依賴圖、使用項目管理工具對齊節點、推動跨部門協同機制入手。其中&#xff0c;通過Gantt圖或關鍵路徑法實現…

mongodb單節點改副本集模式

前一陣將三節點的副本集改成了單節點&#xff0c;但后面業務代碼出現問題&#xff1a;無法使用事務&#xff0c;因為事務只有在副本集上能用&#xff0c;單節點無法使用&#xff0c;故需要改回副本集模式&#xff0c;而我目前僅有一臺服務器&#xff0c;所以考慮在一臺服務器上…

Android 修改了頁面的xml布局,使用了databinding,這時候編譯時需要用到apt嗎

deepseek回答&#xff1a; 在 Android 開發中使用 DataBinding 時&#xff0c;不需要顯式使用 apt&#xff08;Annotation Processing Tool&#xff09;。以下是詳細說明&#xff1a; 1. DataBinding 的編譯機制 DataBinding 是 Android Gradle 插件原生支持的功能&#xff…

服務器如何從http升級到https(nginx)

1.證書申請 可以到阿里云或者華為云去申請證書&#xff0c;申請完下載證書是個壓縮包&#xff0c;然后解壓 可以到到幾個文件夾&#xff0c;找到 .Nginx 文件夾打開 會有兩個文件&#xff0c;將這兩個文件上傳至nginx/conf/cert文件夾下&#xff08;cert需要手…