【LeetCode 熱題 100】5. 最長回文子串——中心擴散法

Problem: 5. 最長回文子串

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(N^2)
    • 空間復雜度:O(1)

整體思路

這段代碼旨在解決經典的 “最長回文子串” (Longest Palindromic Substring) 問題。問題要求在一個給定的字符串 S 中,找到一個最長的、內容左右對稱的連續子串。

該算法采用了一種非常高效且簡潔的 中心擴展 (Expand From Center) 算法。其核心思想是,任何一個回文串,都有一個中心。這個中心可能是一個字符(對于奇數長度的回文串,如 “aba” 的中心是 ‘b’),也可能是兩個字符之間的空隙(對于偶數長度的回文串,如 “abba” 的中心在兩個 ‘b’ 之間)。

算法的邏輯步驟如下:

  1. 統一中心處理

    • 該算法最巧妙的一點是,它通過一個 for 循環 for (int i = 0; i < 2 * n - 1; i++) 來遍歷所有可能的中心。
    • 一個長度為 n 的字符串,有 n 個單字符中心和 n-1 個字符間的中心,總共 2n-1 個。
    • 通過 l = i / 2r = (i + 1) / 2 這兩個計算,可以巧妙地將這 2n-1 個虛擬中心索引 i 映射到字符串的實際索引起點:
      • i 是偶數時(例如 i=4),lr 會相等(l=2, r=2),這對應一個單字符中心,用于查找奇數長度的回文串。
      • i 是奇數時(例如 i=5),r會比l大1(l=2, r=3),這對應一個字符間中心,用于查找偶數長度的回文串。
  2. 從中心向兩邊擴展

    • 對于每一個確定的中心 (l, r),算法進入一個 while 循環。
    • 這個循環同時將左指針 l 向左移動 (l--) 和右指針 r 向右移動 (r++),并持續檢查以下條件:
      a. 指針沒有越界 (l >= 0 && r < n)。
      b. 兩邊指針指向的字符相等 (s[l] == s[r])。
    • 只要這些條件滿足,就說明當前 [l, r] 范圍內的子串是一個回文串,可以繼續嘗試擴展。
  3. 更新最長回文串記錄

    • while 循環因不滿足條件而終止時,最后一個有效的回文串是在 lr 停止移動之前的位置,即 [l+1, r-1]
    • 該回文串的長度為 (r-1) - (l+1) + 1 = r - l - 1
    • 算法將這個長度與已記錄的最長回文串的長度進行比較。如果當前找到的更長,就更新 ansLeftansRight 來記錄這個新發現的最長回文串的邊界。
  4. 返回結果

    • 在遍歷完所有 2n-1 個中心后,ansLeftansRight 中存儲的就是全局最長回文子串的起始索引(包含)和結束索引(不包含)。
    • 最后,使用 S.substring(ansLeft, ansRight) 截取并返回結果。

完整代碼

class Solution {/*** 找到字符串 S 中的最長回文子串。* @param S 輸入的字符串* @return 最長的回文子串*/public String longestPalindrome(String S) {// 將字符串轉換為字符數組,可以略微提高字符訪問效率。char[] s = S.toCharArray();int n = s.length;// ansLeft: 記錄最長回文子串的起始索引(包含)。int ansLeft = 0;// ansRight: 記錄最長回文子串的結束索引(不包含)。int ansRight = 0;// 核心循環:遍歷所有 2n-1 個可能的中心。// i 是一個虛擬的中心索引。for (int i = 0; i < 2 * n - 1; i++) {// 通過 i 計算出中心擴展的起始左右指針。// 如果 i 是偶數, l=r, 對應單字符中心 (奇數長度回文串)。// 如果 i 是奇數, r=l+1, 對應字符間中心 (偶數長度回文串)。int l = i / 2;int r = (i + 1) / 2;// 從中心 (l, r) 向兩邊擴展,尋找回文串。while (l >= 0 && r < n && s[l] == s[r]) {l--;r++;}// 循環結束后,最后一個有效回文串的邊界是 [l+1, r-1]。// 其長度為 (r-1) - (l+1) + 1 = r - l - 1。// 當前記錄的最長長度為 ansRight - ansLeft。if (r - l - 1 > ansRight - ansLeft) {// 如果找到了更長的回文串,則更新記錄。// 新的起始索引是 l+1。ansLeft = l + 1;// 新的結束索引(不包含)是 r。ansRight = r;}}// 根據記錄的邊界,從原始字符串 S 中截取最長回文子串。return S.substring(ansLeft, ansRight);}
}

時空復雜度

時間復雜度:O(N^2)

  1. 外層循環for (int i = 0; i < 2 * n - 1; i++) 遍歷了 2n-1 次,其復雜度為 O(N)
  2. 內層循環while (...) 循環是從每個中心向外擴展。在最壞的情況下(例如,字符串本身就是一個大回文串 “aaaaa…”),從中心開始的擴展可能會一直延伸到字符串的兩端。每次擴展的操作數最多是 N/2 次(向左 N/2,向右 N/2)。因此,內層循環的復雜度是 O(N)
  3. 綜合分析
    總的時間復雜度是外層循環和內層循環復雜度的乘積。即 O(N) * O(N) = O(N^2)

空間復雜度:O(1)

  1. 主要存儲開銷:算法的核心邏輯只使用了固定數量的整型變量(n, ansLeft, ansRight, i, l, r)來存儲指針和結果邊界。
  2. toCharArray()char[] s = S.toCharArray(); 創建了字符串的一個副本,占用了 O(N) 的空間。然而,在標準的算法復雜度分析中,這種對輸入的表示轉換通常不被計入額外輔助空間(auxiliary space),因為核心算法本身(指針操作)并不需要這部分空間(可以直接使用 S.charAt())。
  3. 綜合分析
    如果我們只考慮算法邏輯本身所需的額外空間,那么空間復雜度為 O(1)

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

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

相關文章

六、練習3:Gitee平臺操作

練習3&#xff1a;Gitee平臺操作 練習目標 掌握Gitee平臺的基本操作&#xff0c;包括創建倉庫、推送代碼、團隊協作等。 練習步驟 步驟1&#xff1a;Gitee賬號準備 訪問 gitee.com注冊賬號&#xff08;如果還沒有&#xff09;登錄Gitee 步驟2&#xff1a;配置SSH密鑰 # …

Git軟件版本控制

軟件版本控制作用&#xff1a;軟件源碼版本管理、多人協作開發、版本多分支開發、代碼回滾&#xff08;回退&#xff09;等功能。集中式版本控制&#xff1a;將代碼倉庫放在一臺服務器上&#xff0c;開發時要依賴這臺服務器。優點&#xff1a;簡單、方便管理、適合中小型項目缺…

生產環境Spark Structured Streaming實時數據處理應用實踐分享

生產環境Spark Structured Streaming實時數據處理應用實踐分享 一、業務場景描述 我們所在的電商平臺需要實時監控用戶行為數據&#xff08;如點擊、下單、支付等&#xff09;&#xff0c;基于事件級別的流式數據進行實時統計、會話聚合、漏斗分析&#xff0c;并將結果推送到Da…

海康相機開發---HCNetSDK

HCNetSDK&#xff08;Hikvision Network Software Development Kit&#xff09;是海康威視專為旗下安防監控設備打造的二次開發工具包&#xff0c;是連接上層應用與海康設備的核心橋梁。其封裝了設備底層通信協議&#xff08;包括私有協議與部分標準協議&#xff09;&#xff0…

構建無廣告私人圖書館Reader與cpolar讓電子書庫隨身攜帶

文章目錄前言&#xff1a;告別書荒&#xff0c;拯救靈魂的“摸魚神器”1、關于Reader&#xff1a;小而美的開源在線閱讀器2、Docker部署3、簡單使用reader和添加書源4.群暉安裝Cpolar工具5.創建reader閱讀器的公網地址6.配置固定公網地址前言&#xff1a;告別書荒&#xff0c;拯…

amd cpu是x86架構嗎

是的&#xff0c;AMD CPU屬于x86架構?&#xff0c;其64位擴展&#xff08;x86-64&#xff09;最初由AMD設計并成為行業標準。? ?AMD與x86架構的關系? ?技術淵源?&#xff1a;AMD自1976年起通過技術授權成為x86架構的合法制造商&#xff0c;與英特爾共同主導x86市場。2003…

vercel上線資源無法加載

背景&#xff1a;在本地跑開發服務器沒問題&#xff0c;但是部署到 vercel 上就有問題上一次出現類似問題是在更新游戲引擎方法后本地可以跑但是上線沒有成功&#xff0c;當時是因為 runner.html 是在部署時通過腳本從遠端倉庫拉取的&#xff0c;所以解決方案&#xff1a;1.更新…

Node.js 的模塊化規范是什么?CommonJS 和 ES6 模塊有什么區別?

目錄 一、為什么需要模塊化&#xff1f; 二、Node.js 的模塊化規范 三、CommonJS 模塊化 1. 基本語法 2. 特點 3. 缺點 四、ES6 模塊&#xff08;ESM&#xff09; 1. 基本語法 2. 特點 3. 在 Node.js 中的使用 五、CommonJS 和 ES6 模塊的區別 六、實際開發中的選擇…

設計模式:代理模式(Proxy Pattern)

文章目錄一、代理模式的定義二、實例分析三、示例代碼一、代理模式的定義 代理模式是一種結構型設計模式&#xff0c;它為某個對象提供一個代理或占位符&#xff0c;以控制對這個對象的訪問。簡單來說代理對象在客戶端和目標對象之間起到中介作用&#xff0c;客戶端并不會直接操…

數據類型序列化-封裝

/// <summary> /// 定義泛型接口 /// </summary> /// <typeparam name"T">T</typeparam> public interface ISettingValue<T> {/// <summary>/// value/// </summary>T DoubleValue { get; }/// <summary>/// key//…

PitVis-2023挑戰賽:內鏡下垂體瘤手術視頻中的手術流程識別|文獻速遞-深度學習人工智能醫療圖像

Title題目PitVis-2023 challenge: Workflow recognition in videos of endoscopic pituitary surgeryPitVis-2023挑戰賽&#xff1a;內鏡下垂體瘤手術視頻中的手術流程識別01文獻速遞介紹內鏡視覺挑戰賽與PitVis-2023挑戰賽背景及核心內容 “內鏡視覺&#xff08;EndoVis&#…

2025年8月個人工作生活總結

本文為 2025年8月工作生活總結。研發編碼 無處不在的AI 現在很多地方都在推AI&#xff0c;廣西的人工智能走在前列&#xff0c;要賦能各行各業。至于我&#xff0c;主要就是在寫點代碼&#xff0c;寫點交差的文檔。其實現在我已經有點分析哪些代碼哪些文字是AI寫的了。我工作用…

Dubbo常見面試題

1、默認使用的是什么通信框架&#xff0c;還有別的選擇嗎? 默認也推薦使用netty框架&#xff0c;還有mina。 2、服務調用是阻塞的嗎&#xff1f; 默認是阻塞的&#xff0c;可以異步調用&#xff0c;沒有返回值的可以這么做。 3、一般使用什么注冊中心&#xff1f;還有別的…

簡單的加密算法

// 加密函數&#xff08;32位版本&#xff09; //這里的 data 是ID&#xff0c; dword encrypt(dword data, dword key, int shift) {data ^ key; // 第一步&#xff1a;異或混淆// 循環左移&#xff08;shift范圍1-31&#xff09;return (data << sh…

升級的MS9125S USB投屏控制芯片(VGAHD輸出)

MS9125S是一款USB單芯片投屏器&#xff0c;內部集成了USB 2.0控制器和數據收發模塊、視頻DAC、HD接口和音視頻處理模塊&#xff0c;支持壓縮視頻傳輸。MS9125S可以通過USB接口顯示或者擴展PC、智能手機、平板電腦的顯示信息到更大尺寸的顯示設備上&#xff0c;支持VGA和HD視頻接…

求歐拉回路:Hierholzer算法圖解模擬

代碼模板&#xff1a;List<Integer> resultList new ArrayList<>();List<Integer> hierholzer() {dfs(0);resultList.add(0);// 數組反轉Collections.reverse(resultList);return resultList; }void dfs(int start) {for(int end : G[start]) {if(!vis[star…

Kafka面試精講 Day 2:Topic、Partition與Replica機制

【Kafka面試精講 Day 2】Topic、Partition與Replica機制 在“Kafka面試精講”系列的第二天&#xff0c;我們將深入剖析Kafka最核心的三大數據組織機制&#xff1a;Topic&#xff08;主題&#xff09;、Partition&#xff08;分區&#xff09;與Replica&#xff08;副本&#x…

【備戰2025數模國賽】(三)數模常見賽題類型及解決辦法

在進行數學建模競賽時&#xff0c;很多同學面臨的第一個挑戰是如何對賽題進行歸類&#xff0c;并選擇合適的模型。本篇梳理了數學建模中最常見的幾類賽題&#xff0c;并針對每類題型提供了基本的解決思路&#xff0c;幫助大家快速選擇合適的解題方法&#xff0c;高效完成模型構…

LabVIEW測斜設備承壓試驗臺

為保障煤礦井下地質勘探鉆孔中測斜裝備的可靠運行&#xff0c;設計基于 LabVIEW的鉆孔測斜設備承壓性能試驗臺。該試驗臺以氣動增壓泵為壓力執行元件&#xff0c;結合虛擬儀器與 PLC 控制技術&#xff0c;可精準模擬井下壓力環境&#xff0c;完成水壓、疲勞等試驗&#xff0c;實…

四、練習1:Git基礎操作

練習1&#xff1a;Git基礎操作 練習目標 通過實際操作掌握Git的基本命令&#xff0c;包括初始化倉庫、添加文件、提交更改等。 練習步驟 步驟1&#xff1a;環境準備 確保已安裝Git配置用戶信息&#xff08;如果未配置&#xff09; # 檢查Git版本 git --version# 配置用戶信息 g…