詳解Manacher算法

一、基本介紹

Manacher算法,又稱為馬拉車算法(Manacher’s Algorithm),是一種用於在字符串中查找最長迴文子串的算法,時間複雜度為O(n)。該算法的核心思想是基於已知的迴文子串來擴展新的迴文子串。

二、算法思想

Manacher算法的核心思想是基於已知的對稱中心擴展迴文子串。我們會對每個字符進行處理,以該字符為中心,分為兩種情況:

1、如果這個字符在之前的某一個迴文子串中(不一定是最長的),則我們可以利用這個已知信息,將這個字符作為以當前字符為中心的迴文子串的起點。

2、如果這個字符沒有出現在之前的任何迴文子串中,那麼我們需要拓展以這個字符為中心的迴文子串的長度。在這個過程中,我們需要判斷以當前字符為中心的迴文子串的長度,並記錄下來以備後用。

三、核心代碼

以下是Manacher算法的核心代碼,代碼中使用兩個數組記錄當前已知的最長迴文半徑和對應的迴文串。

string manacher(string& s) {
    string t = "$#";
    for (auto& c : s) {
        t += c;
        t += '#';
    }
    int n = t.size();
    vector p(n);
    int mx = 0, id = 0, resLen = 0, resCenter = 0;
    for (int i = 1; i  i ? min(p[2 * id - i], mx - i) : 1;
        while (t[i + p[i]] == t[i - p[i]]) ++p[i];
        if (mx < i + p[i]) {
            mx = i + p[i];
            id = i;
        }
        if (resLen < p[i]) {
            resLen = p[i];
            resCenter = i;
        }
    }
    return s.substr((resCenter - resLen) / 2, resLen - 1);
}

四、優化 – Manacher算法優化

在實際應用中,可以通過預處理的方式,優化Manacher算法,可以大大降低計算量,加快計算速度。

具體優化方法是先將字符串預處理,將相鄰的相同字符進行壓縮,避免重複計算。此外,通過添加虛擬字符,避免中心是一個字符時需要特殊處理的情況。

string manacher(string& s) {
    int n = s.size();
    string t;
    t += '#';
    for (int i = 0; i < n; i++) {
        t += s[i];
        t += '#';
    }
    n = t.size();

    vector p(n);

    int mx = 0, id = 0, resLen = 0, resCenter = 0;
    for (int i = 1; i  i)
            p[i] = min(mx - i, p[2 * id - i]);
        else
            p[i] = 1;

        while (t[i + p[i]] == t[i - p[i]]) 
            p[i]++;

        if (i + p[i] > mx) {
            mx = i + p[i];
            id = i;
        }

        if (p[i] > resLen) {
            resLen = p[i];
            resCenter = i;
        }
    }

    return s.substr((resCenter - resLen) / 2, resLen - 1);
}

五、實際應用

Manacher算法可以解決多種應用問題,例如迴文字符串匹配、最長迴文子序列、最長迴文子串等等。此外,Manacher算法還可以用於字符串壓縮,比如將重複的段落(如HTML中的)進行壓縮,縮短文本長度。

六、總結

Manacher算法是一種高效的查找最長迴文子串的算法,時間複雜度為O(n)。通過預處理和優化,可以進一步提高計算效率。Manacher算法在實際應用中非常廣泛,可以解決迴文字符串匹配、最長迴文子序列、最長迴文子串等問題。

原創文章,作者:FWDNB,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/331639.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FWDNB的頭像FWDNB
上一篇 2025-01-20 14:10
下一篇 2025-01-20 14:10

相關推薦

  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 瘦臉算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉算法 Python 實現的原理和方法,包括該算法的意義、流程、代碼實現、優化等內容。 一、算法意義 隨着科技的發展,瘦臉算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 神經網絡BP算法原理

    本文將從多個方面對神經網絡BP算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP算法簡介 BP算法是一種常用的神經網絡訓練算法,其全稱為反向傳播算法。BP算法的基本思想是通過正…

    編程 2025-04-29
  • 粒子群算法Python的介紹和實現

    本文將介紹粒子群算法的原理和Python實現方法,將從以下幾個方面進行詳細闡述。 一、粒子群算法的原理 粒子群算法(Particle Swarm Optimization, PSO…

    編程 2025-04-29
  • Python回歸算法算例

    本文將從以下幾個方面對Python回歸算法算例進行詳細闡述。 一、回歸算法簡介 回歸算法是數據分析中的一種重要方法,主要用於預測未來或進行趨勢分析,通過對歷史數據的學習和分析,建立…

    編程 2025-04-28
  • 象棋算法思路探析

    本文將從多方面探討象棋算法,包括搜索算法、啟發式算法、博弈樹算法、神經網絡算法等。 一、搜索算法 搜索算法是一種常見的求解問題的方法。在象棋中,搜索算法可以用來尋找最佳棋步。經典的…

    編程 2025-04-28

發表回復

登錄後才能評論