馬拉車算法

Manacher算法 ,用于處理最長回文字符串的問題,可以在O(n)的情況下,求出一個字符串的最長回文字符串

回文串的基礎解法:
以每個點為中心對稱點,看左右兩邊的點是否相同。這種算法的時間復雜度為O(n^2),并且奇偶字符串的中心點是不同的。因此在處理時,可以在字符串的中間加上特殊字符,以使其都變成奇字符串,列如字符串:abba可以變成:#a#b#b#a#,字符串aba可以變成:#a#b#a#這樣無論對于奇字符串還是偶字符串都變成同樣的處理邏輯了。具體實現代碼如下所示:

data = "#"+"#".join(data)+"#"
n = len(data)
res = 0
for i in range(1,n-1):temp = 0l = i-1r = i+1while l>0 and r<n:if data[l] == data[r]:temp += 1l-=1r+=1else:res = max(res,temp)breakres = max(res,temp)
print(res)

馬拉車算法
馬拉車算法同樣使用特殊字符做預處理。首先先講解一下馬拉車算法的原理。對于字符串bcbabcc來說,通過處理可以將其變成 ^#b#c#b#a#b#c#c#$
我們使用一個數組p來記錄每個字符的可以擴展長度。比如第一個字符c來說,以c為中心點,分別判斷其左邊的字符和右邊的字符是否相等,看以c為中心點的最長回文字符串是3。即p[4]=3。
接下來,我們用c,r 兩個字符來分別表示中心點和可擴展到最右邊的長度。當我們以c為中心點時,其c為4,r為7。
根據回文字符串的特性來說,回文字符串的左邊必定是等于右邊的。因此以c為中心左邊的三個字符的p值一定是等于以c為中心右邊三個字符的p值的。

從1開始遍歷字符串,初始化c=0,r=0,p=[0]*字符串長度,
有三種情況:
1、遍歷的下標大于r:此時前面回文字符串的特性不能用,因此需要找到以該下標為中心點,向左向右判定p[i]的值
2、遍歷的下標小于r:根據回文字符串的特性,可以直接填充,比如·當我們遍歷到底一個字符c時,前面p的值為0,0,1,0,3.此時中心值為4,r為7,則由回文字符串的特性可以直接將后面的三個進行對稱填充為010。另一點需要注意的是,不能單純的進行對稱填充還要考慮范圍。如果對稱的值大于可覆蓋的范圍是不可取的。

具體的python實現代碼為:

def manacher(li):n = '^#' + '#'.join(li) + '#$'c = 0r = 0p = [0] * len(n)for i in range(1, len(n) - 1):##在邊界內if i <= r:p[i] = min(p[2 * c - i], r - i)##判斷左右是否相等while n[i - (1 + p[i])] == n[i + (1 + p[i])]:p[i] += 1##超出邊界,重新定義邊界和中心點if p[i] + i > r:r = p[i] + ic = ireturn max(p)
li = input()
print(manacher(li))

參考文章:
徹底搞懂馬拉車(Manacher)
參考視頻:
b站馬拉車算法

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

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

相關文章

氣象學中的CDO插值(多方法+多分辨率)

文章目錄 說明CDO代碼 說明 需要新建.sh腳本文件&#xff0c;將下面的CDO代碼復制到.sh腳本中&#xff0c;然后運行插值程序。 CDO代碼 #!/bin/bash # # 用戶配置區&#xff08;按實際需求修改&#xff09; # input_directory"2m_temperature" # 自定義路徑 gr…

計算機網絡:應用層 —— 動態主機配置協議 DHCP

文章目錄 什么是 DHCP&#xff1f;DHCP 的產生背景DHCP 的工作過程工作流程地址分配機制 DHCP 中繼代理總結 什么是 DHCP&#xff1f; 動態主機配置協議&#xff08;DHCP&#xff0c;Dynamic Host Configuration Protocol&#xff09;是一種網絡管理協議&#xff0c;用于自動分…

【OS安裝與使用】part3-ubuntu安裝Nvidia顯卡驅動+CUDA 12.4

文章目錄 一、待解決問題1.1 問題描述1.2 解決方法 二、方法詳述2.1 必要說明2.2 應用步驟2.2.1 更改鏡像源2.2.2 安裝NVIDIA顯卡驅動&#xff1a;nvidia-550&#xff08;1&#xff09;查詢顯卡ID&#xff08;2&#xff09;PCI ID Repository查詢顯卡型號&#xff08;3&#xf…

數據導入AI訓練步驟——人工智能訓練

一、人工操作轉化 數據導入過程 整理excel表格&#xff0c;通過數據庫管理工具導入數據&#xff0c;補充數據格式&#xff0c;調整sql語句 復制數據到目標數據 二、整理表格 三、導入數據 通過數據庫導入數據 四、合并 五、驗證更新數據 六、 更新數據 update temp_cus_hmz…

我國首條大型無人機城際低空物流航線成功首航

首航震撼開場&#xff1a;羊肉 “飛” 越 540 公里 在夜色的籠罩下&#xff0c;榆陽馬合通用機場的跑道上&#xff0c;一架大型固定翼無人機蓄勢待發&#xff0c;機身被燈光照亮&#xff0c;宛如一只即將展翅翱翔的鋼鐵巨鳥。它的貨艙里&#xff0c;滿滿裝載著新鮮的榆林羊肉&a…

《跟李沐學 AI》AlexNet論文逐段精讀學習心得 | PyTorch 深度學習實戰

前一篇文章&#xff0c;使用 AlexNet 實現圖片分類 | PyTorch 深度學習實戰 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章內容來自于學習 9年后重讀深度學習奠基作之一&#xff1a;AlexNet【下】【論文精讀】】的心得。 《跟李沐…

微軟Win11新動態:官方“換機助手”曝光,PC數據遷移或迎全新體驗

目錄 微軟入局數據遷移領域,第三方工具或面臨挑戰 無縫遷移體驗:近距離傳輸與OTP驗證 模擬圖僅為概念設計,最終功能或存變數 發布時間未定,Insider用戶或率先體驗 總結 微軟在近期發布了Windows 11 Insider Beta頻道的最新版本Build 22635.4945。盡管此次更新并未引入重…

Could not initialize class io.netty.util.internal.Platfor...

異常信息&#xff1a; Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjec…

java練習(34)

ps:題目來自力扣 尋找兩個正序數組的中位數 給定兩個大小分別為 m 和 n 的正序&#xff08;從小到大&#xff09;數組 nums1 和 nums2。請你找出并返回這兩個正序數組的 中位數 。 算法的時間復雜度應該為 O(log (mn)) 。 class Solution {public double findMedianSortedA…

用Java創建一個驗證碼的工具類

在Java中創建一個驗證碼工具類&#xff0c;可以通過以下代碼實現。該工具類支持生成包含字母和數字的隨機驗證碼圖片&#xff0c;并添加干擾線和噪點以提高安全性。以下是詳細實現&#xff1a; 完整代碼實現 import javax.imageio.ImageIO; import java.awt.*; import java.aw…

提升信息檢索準確性和效率的搜索技巧

一、基礎技巧 精準關鍵詞 避免長句子&#xff0c;提取核心關鍵詞&#xff08;如用“光合作用 步驟”代替“請告訴我光合作用的具體過程”&#xff09;。 同義詞替換&#xff1a;嘗試不同表達&#xff08;如“AI 發展史” vs “人工智能 歷史”&#xff09;。 排除干擾詞 使用…

設計模式 之 工廠模式(簡單工廠模式、工廠方法模式、抽象工廠模式)(C++)

文章目錄 C 工廠模式引言一、簡單工廠模式概念實現步驟示例代碼優缺點 二、工廠方法模式概念實現步驟示例代碼優缺點 三、抽象工廠模式概念實現步驟示例代碼優缺點 C 工廠模式 引言 在 C 編程中&#xff0c;對象的創建是一個常見且基礎的操作。然而&#xff0c;當項目規模逐漸…

DAY12 Tensorflow 六步法搭建神經網絡

六步法&#xff1a; 一.import 導入各種庫&#xff0c;比如&#xff1a; import tensorflow as tf from tensorflow.keras.layers import Dense, Flatten from tensorflow.keras import Model import numpy as np import pandas as pd # 可能還會根據需求導入其他庫&…

Zookeeper分布式鎖實現

zookeeper最初設計的初衷就是為了保證分布式系統的一致性。本文將講解如何利用zookeeper的臨時順序結點&#xff0c;實現分布式鎖。 目錄 1. 理論分析 1.1 結點類型 1.2 監聽器 1.3 實現原理 2. 手寫實現簡易zookeeper分布式鎖 1.1 依賴 1.2 常量定義 1.3 實現zookeeper分布式…

Git是什么

簡單介紹&#xff1a; Git是一個分布式版本控制系統&#xff0c;用于跟蹤文件的更改&#xff0c;特別是在多人協作開發的環境中。 Key: 分布式 版本控制 系統 最常用于軟件開發&#xff0c;但也可以用于管理任何類型的文件和文件夾。 Git幫助團隊跟蹤和管理文件的歷史版本&a…

Pycharm 2024在解釋器提供的python控制臺中運行py文件

2024版的界面發生了變化, run with python console搬到了這里:

【分布式理論12】事務協調者高可用:分布式選舉算法

文章目錄 一、分布式系統中事務協調的問題二、分布式選舉算法1. Bully算法2. Raft算法3. ZAB算法 三、小結與比較 一、分布式系統中事務協調的問題 在分布式系統中&#xff0c;常常有多個節點&#xff08;應用&#xff09;共同處理不同的事務和資源。前文 【分布式理論9】分布式…

免費deepseek的API獲取教程及將API接入word或WPS中

免費deepseek的API獲取教程: 1 https://cloud.siliconflow.cn/中注冊時填寫邀請碼&#xff1a;GAejkK6X即可獲取2000 萬 Tokens; 2 按照圖中步驟進行操作 將API接入word或WPS中 1 打開一個word&#xff0c;文件-選項-自定義功能區-勾選開發工具-左側的信任中心-信任中心設置…

【SFRA】筆記

GK_SFRA_INJECT(x) SFRA小信號注入函數,向控制環路注入一個小信號。如下圖所示,當前程序,小信號注入是在固定占空比的基礎疊加小信號,得到新的占空比,使用該占空比控制環路。 1.2 GK_SFRA_COLLECT(x, y) SFRA數據收集函數,將小信號注入環路后,該函數收集環路的數據,以…

論文筆記-WSDM2024-LLMRec

論文筆記-WSDM2024-LLMRec: Large Language Models with Graph Augmentation for Recommendation LLMRec: 基于圖增強的大模型推薦摘要1.引言2.前言2.1使用圖嵌入推薦2.2使用輔助信息推薦2.3使用數據增強推薦 3.方法3.1LLM作為隱式反饋增強器3.2基于LLM的輔助信息增強3.2.1用戶…