LeetCode算法日記 - Day 33: 最長公共前綴、最長回文子串

目錄

1. 最長公共前綴

1.1 題目解析

1.2 解法

1.3 代碼實現

2. 最長回文子串

2.1 題目解析

2.2 解法

2.3 代碼實現


1. 最長公共前綴

14. 最長公共前綴 - 力扣(LeetCode)

編寫一個函數來查找字符串數組中的最長公共前綴。

如果不存在公共前綴,返回空字符串?""

示例 1:

輸入:strs = ["flower","flow","flight"]
輸出:"fl"

示例 2:

輸入:strs = ["dog","racecar","car"]
輸出:""
解釋:輸入不存在公共前綴。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i]?如果非空,則僅由小寫英文字母組成

1.1 題目解析

題目本質:
在若干字符串中尋找“所有字符串共同擁有的起始前綴”。等價于:找出最小公共“列”的連續一致部分。

常規解法:
1)把第一個串當基準,從左到右逐列比較;
2)每一列都檢查“是否所有字符串在該列字符一致”;
3)一旦某列有人越界或字符不同,前綴到此為止。

問題分析:
最直觀做法已是高效思路:每個字符最多被比較一次,因此總比較次數與所有字符串總長度同階。時間復雜度可以做到 O(S)(S 為全部字符數),空間 O(1)。

思路轉折:
如果直接兩兩比較并把“相同字符累加到全局結果”容易錯,正確做法是統一按列比較(縱向掃描),或者維護前綴并逐步截短(水平掃描)。兩者復雜度相同,縱向掃描實現更直觀、易于避免細節錯誤。

1.2 解法

算法思想:
設基準串 s0 = strs[0]。對位置 i = 0..s0.length()-1:

  • 取 ch = s0[i];

  • 對每個其他字符串 sj,若 i >= sj.length() 或 sj[i] != ch,則答案為 s0.substring(0, i);

  • 若全部匹配,繼續下一個位置。
    若循環結束,返回 s0 本身。

i)邊界:若數組為空,返回空串。

ii)外層循環位置 i 遍歷基準串每一位。

iii)內層循環字符串索引 j 從 1 到 n-1,檢查第 i 位是否存在且相等。

iiii)發現不匹配立即返回前綴;全部通過則最終返回基準串。

易錯點:

  • 索引混淆: ?內層訪問字符必須用 strs[j].charAt(i),而不是 strs[i]...。

  • substring 語義:?substring(0, i) 的右端不含 i,當 i == 0 返回空串是正確結果。

  • 空字符串參與: 若某個字符串長度為 0,第一次比較即返回空串。

  • 判空與長度: ?數組用 .length,字符串用 .length()。

1.3 代碼實現

class Solution {public String longestCommonPrefix(String[] strs) {// 1) 邊界處理if (strs == null || strs.length == 0) return "";// 2) 縱向掃描:以第一個字符串為基準,逐列檢查for (int i = 0; i < strs[0].length(); i++) {char ch = strs[0].charAt(i);// 與其余字符串在第 i 位統一比較for (int j = 1; j < strs.length; j++) {// 越界或字符不等:i 之前均為公共前綴if (i >= strs[j].length() || strs[j].charAt(i) != ch) {return strs[0].substring(0, i);}}}// 3) 基準串完全通過:它本身就是最長公共前綴return strs[0];}
}

復雜度分析:

  • 時間:O(S),S 為所有字符串總長度(每個位置最多檢查一次)。

  • 空間:O(1) 額外空間(只用常數級變量)。

2. 最長回文子串

5. 最長回文子串 - 力扣(LeetCode)

給你一個字符串?s,找到?s?中最長的?回文?子串。

示例 1:

輸入:s = "babad"
輸出:"bab"
解釋:"aba" 同樣是符合題意的答案。

示例 2:

輸入:s = "cbbd"
輸出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s?僅由數字和英文字母組成

2.1 題目解析

題目本質:
在字符串中找到“關于某一中心左右對稱”的最長連續子串。回文子串可由一個“中心”向兩側對稱擴展得到:奇數長度中心為 (i,i),偶數長度中心為 (i,i+1)。

常規解法:
暴力枚舉所有子串再判斷是否回文:兩重循環確定區間、再線性判斷。

問題分析:
暴力法需要枚舉 O(n^2) 個區間,每次校驗 O(n),最壞 O(n^3),n=1000 時不夠高效。

思路轉折:
要想高效 → 利用“回文圍繞中心對稱”的性質,只需枚舉中心并向兩側擴展

  • 每個中心向外擴的總步數受限于 n,因此總體最壞 O(n^2);

  • 實現簡單、無額外空間;

  • 面試與刷題的主流解法(更快的 O(n) Manacher 可作為進階)。

2.2 解法

解法

算法思想:
對每個位置 i

  • 以 (i,i) 作為奇數回文中心擴展,得到長度 len1 = r1-l1-1;

  • 以 (i,i+1) 作為偶數回文中心擴展,得到長度 len2 = r2-l2-1;

  • 取更長者更新答案起點 begin = L+1 與長度 len。
    擴展結束條件:越界或兩側字符不等。

i)特判:空串或長度 1 直接返回。

ii)初始化 begin=0,len=0。

iii)遍歷中心 i = 0..n-1:

  • 令 l=i,r=i,while 兩側相等則擴展;根據 right-left-1 更新答案;

  • 令 l=i,r=i+1,同理擴展并比較更新。

iiii)返回 s.substring(begin, begin+len)(右端開區間)。

易錯點:

  • 區間邊界:擴展結束時下標已越過合法區間,真正回文是 (left+1, right-1),長度為 right-left-1;最終 substring 用 [begin, begin+len)。

  • 奇/偶中心都要嘗試:只試一種會漏解。

  • 變量遮蔽:沒必要定義類字段 left/right,用方法內局部變量即可,避免混淆。

2.3 代碼實現

class Solution {public String longestPalindrome(String s) {int n = s.length();if (n < 2) return s; // 長度為 0/1,自己就是最長回文int begin = 0, len = 1; // 至少有 1 個字符時,單字符是回文for (int i = 0; i < n; i++) {// 奇數中心 (i, i)int l = i, r = i;while (l >= 0 && r < n && s.charAt(l) == s.charAt(r)) { l--; r++; }if (r - l - 1 > len) {begin = l + 1;len = r - l - 1;}// 偶數中心 (i, i+1)l = i; r = i + 1;while (l >= 0 && r < n && s.charAt(l) == s.charAt(r)) { l--; r++; }if (r - l - 1 > len) {begin = l + 1;len = r - l - 1;}}return s.substring(begin, begin + len);}
}

復雜度分析

  • 時間:最壞 O(n^2)(每個中心向外擴總步數受限于 n)。

  • 空間:O(1) 額外空間。

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

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

相關文章

Python畢業設計推薦:基于Django的飲食計劃推薦與交流分享平臺 飲食健康系統 健康食譜計劃系統

精彩專欄推薦訂閱&#xff1a;在 下方專欄&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主頁&#xff1a;計算機畢設木哥&#x1f525; &#x1f496; 文章目錄 一、項目介紹二…

物聯網雙軸傾角傳感器廠家全面解析

內容概要本文旨在全面解析物聯網雙軸傾角傳感器廠家的核心競爭力&#xff0c;為進口設備代理商及工業物聯網項目提供實用選型指南。我們將深入探討行業領先制造商的研發實力和生產標準&#xff0c;重點分析產品特性如低功耗設計優勢、0.2高精度測量特性&#xff0c;以及CAN/電流…

Docker學習筆記-網絡類型

Docker 網絡類型1、Docker四種網絡模式 &#xff08;1&#xff09;docker四種網絡模式如下&#xff1a; Bridge contauner 橋接式網絡模式Host(open) container 開放式網絡模式Container(join) container 聯合掛載式網絡模式&#xff0c;是host網絡模式的延伸None(Close)…

SDRAM詳細分析-08 數據手冊解讀

大家好,這里是大話硬件。 前面我們梳理了很多關于內存的內容,不知道有沒有人好奇,為什么要花這么大的精力做這些內容? 在4月份的時候,三星宣布將在2025年逐步停產DDR4內存顆粒,隨后海力士和鎂光也跟著一起,都宣布逐步停產DDR4顆粒。這三家半導體廠商在內存方面頂了半邊…

Windows 環境下部署 MinIO 集群

文章目錄介紹軟件特點下載多機分布式集群部署1.前提準備2. 新建minio工作目錄3. 編寫運行命令4. 啟動、測試5. nginx配置介紹 MinIO 是一款高性能、開源、云原生的分布式對象存儲系統&#xff0c;專為私有云、公有云和邊緣計算場景設計&#xff0c;完全兼容 Amazon S3 API&…

鴻蒙libxm2交叉編譯

一開始先使用了lycium,但是沒有編譯通過 改為使用源碼自帶的配置文件編譯 我使用的源碼是libxml2-2.9.10.tar.gz 解壓后進行下面的配置: root@ubuntu:/home/lw/libxml2-2.9.10# export OHOS_SDK=/home/lw/ohos-sdk/linuxroot@ubuntu:/home/lw/libxml2-2.9.10# export AS=…

MCAP :機器人數據容器的全面實踐指南

Outline: MCAP 已形成完整工具鏈生態&#xff1a; Foxglove Studio&#xff1a;可視化分析工具mcap-cli&#xff1a;跨平臺命令行工具AWS RoboMaker&#xff1a;原生云存儲支持 隨著 IEEE 正在制定的 P3196 機器人數據標準&#xff0c;MCAP 正在演進為行業基礎架構的重要組成…

【Bluedroid】A2dp Source播放流程源碼分析(7):藍牙音頻流啟動流程深度解析(btif_av_stream_start)

本文深入分析Android Bluetooth協議棧中A2DP音頻流啟動的完整流程,從應用層調用btif_av_stream_start()開始,穿越BTIF、BTA、AVDTP多層架構,最終通過L2CAP發送AVDTP啟動命令。揭示狀態機驅動、異步消息傳遞、流控制等核心機制。并通過代碼與日志結合的方式,揭示藍牙音頻流從…

Miniconda安裝與VSCode搭建遠程Python、Jupyter開發環境

前言 數據科學和機器學習工作流程中&#xff0c;當本地計算機無法滿足計算任務的需求時&#xff0c;往往需要一個更強大計算能力的遠程環境。另一方面&#xff0c;VSCode由于其輕便和易用性&#xff0c;以及豐富的插件生態系統&#xff0c;一直是遠程開發的首選編輯器。本文介紹…

vue3前端開發的基礎教程——快速上手

【前言】這里使用的技術棧&#xff1a;fastapivue3pycharm一、創建vue3項目在項目的文件夾使用下面命令創建vue3前端框架代碼npm create vitelatest frontend選擇框中選擇&#xff1a; Framework: VueVariant: JavaScript 或 TypeScript cd frontend npm install啟動本地開發np…

51單片機2(按鍵,外部中斷,定時器中斷,PWM與蜂鳴器)

1.按鍵模塊以按鍵k1為例&#xff1a;兩個引腳被接到GND和P1_4引腳&#xff0c;當K1按鍵被按下時&#xff0c;P1_4引腳會和GND短路到一起&#xff0c;P1_4引腳會呈現低電平。按鍵初始化&#xff1a;//按鍵初始化 void Key_Init(void) {P1 | (0x0f << 4);P3 | (1 << …

【面試向】人工智能機器學習介紹

一、介紹 人工智能&#xff08;AI&#xff09;是通過模擬、延伸和擴展人類智能的技術&#xff0c;使機器能夠感知、理解、決策和行動。核心目標是實現“智能自動化”&#xff0c;即讓機器在復雜、動態的環境中自主完成任務&#xff0c;甚至超越人類在特定領域的能力。 機器學…

Python趣味入門:打印與計算初體驗

1. 嘗試使用 print() 打印各種內容print() 是我們在Python中最先接觸也是最常用的函數之一。它的核心功能是將內容輸出到控制臺。讓我們用它來玩點花樣&#xff1a;在您的IDE中創建一個新的Python文件&#xff08;例如 play_with_print.py&#xff09;&#xff0c;然后嘗試以下…

swagger接口文檔規范化(蒼穹外賣)

swagger接口文檔規范化 &#xff08;1&#xff09;說明&#xff1a; 將接口文檔分為管理端和用戶端 &#xff08;2&#xff09;WebMvcConfiguration修改 位置&#xff1a;sky-server/src/main/java/com/sky/config/WebMvcConfiguration.java 文件完整代碼&#xff1a; pa…

Transformer 架構的演進與未來方向(RNN → Self-Attention → Mamba)——李宏毅大模型2025第四講筆記

一句話總結——“所有架構都為了解決上一代模型的致命缺陷而生&#xff1a;CNN 解決參數爆炸&#xff0c;ResNet 解決梯度消失&#xff0c;Transformer 解決 RNN 無法并行&#xff0c;而 Mamba 則試圖一次解決 Transformer 的 O(N) 與 RNN 的記憶瓶頸。”1 每種架構的存在理由?…

Vllm-0.10.1:通過vllm bench serve測試TTFT、TPOT、ITL、E2EL四個指標

一、KVM 虛擬機環境GPU:4張英偉達A6000(48G)內存&#xff1a;128G海光Cpu:128核大模型&#xff1a;DeepSeek-R1-Distill-Qwen-32B推理框架Vllm:0.10.1二、四個性能指標介紹2.1、TTFT:Time to First token首次生成token時間&#xff08;ms&#xff09;,TTFT 越短&#xff0c;用戶…

邏輯回歸基礎

昨天一直在復盤梯度下降&#xff0c;都沒咋預習邏輯回歸&#xff0c;好在不是很難&#xff0c;來捋捋邏輯回歸簡介邏輯回歸是解決分類問題數學基礎-sigmoid函數還要回顧一下概率論極大似然估計再來看一下對數邏輯回歸原理邏輯回歸的損失函數例子&#xff1a;分類問題評估混淆矩…

STM32----W25QXX

W25QXX款圖W25QXX存儲解讀塊--->扇-->頁塊分成128塊一塊64kb一塊分成16扇一扇4kb一個扇區分成16頁&#xff0c;頁的大小是256個字節 當數據傳入W25QXX最小的擦除單元是扇區當已經輸入了一頁的數據&#xff0c;這時RAM的數據會轉存進FLASH&#xff0c;這時會置一個標志位&…

【Kafka】Kafka使用場景用例Kafka用例圖

【Kafka】Kafka使用場景用例&Kafka用例圖一、Kafka用例總圖二、Kafka用例圖示三、Kafka場景案例圖一、Kafka用例總圖 二、Kafka用例圖示 三、Kafka場景案例圖 注&#xff1a;以上圖片來源于網絡&#xff0c;如有不妥請私信刪除&#xff01;

Altium Designer(AD24)集成開發環境簡介

??《專欄目錄》 目錄 1,概述 2,界面介紹 2,搜索功能簡介 1,概述 Altium Designer 24的原理圖,PCB等設計工作都是在集成開發環境中進行的,本文簡單介紹集成開發環境界面。 2,界面介紹 如下圖所示,Altium Designer 24的集成開發環境,包括: 標題欄:目前設計中文件的…