演算法 最長回文長度

2021-09-17 20:51:55 字數 1726 閱讀 8851

問題描述

給定乙個字串,求它的最長回文子串的長度(連續長度或者不連續長度)。

回文串就是正著讀和反著讀都一樣的字串。

問題一:判斷是否是回文

分析:根據定義進行判斷,首尾不一致,則就不是回文

bool ispalindrome(string& str, int begin, int end)

else

} return true;

}

問題二:連續條件下最長回文長度分析:給定乙個字串,求它的最長連續的回文子串的長度,這裡介紹兩種方法;

最長回文串(可不連續)的意思是以某個字元為軸,分別往左右遍歷的公共子串的最大長度(可不連續),那麼不如將最大回文串改為乙個字串的順序與逆序的最大公共子串(可不連續)。

方法1:暴力法(bruteforce,bf)

先求出該字串的每乙個子串,然後再分別判斷每個子串是否是回文串,找到長度最長的那個。其中求出每個子串的時間複雜度為o(n2),判斷是否為回文串的複雜度為o(n),兩者是相乘關係,所以整個演算法的時間複雜度為o(n3)。

int lengthbf(string& str)

} }return longest;

}

方法2:動態規劃對於字串str,假設dp[i,j]=1表示子串str[i...j]是回文子串,那個必定存在dp[i+1,j-1]=1。這樣最長回文子串就能分解成一系列子問題,可以利用動態規劃求解了。動態規劃的時間複雜度也為o(n2)。

首先構造狀態轉移方程

上面的狀態轉移方程表示,當str[i]=str[j]時,如果str[i+1...j-1]是回文串,則str[i...j]也是回文串;如果str[i+1...j-1]不是回文串,則str[i...j]不是回文串。

初始狀態

上式表示的意義是單個字元,兩個相同字元都是回文串。

int lengthdp(string& str)

for (int i = 0; i < len; i++)

} return longest;

}

問題三:不連續條件下字長回文長度分析:定義

manacher演算法求最長回文串長度

manacher演算法 定義陣列p i 表示以i為中心的 包含i這個字元 回文串半徑長 將字串s從前掃到後for int i 0 i由於s是從前掃到後的,所以需要計算p i 時一定已經計算好了p 1 p i 1 假設現在掃瞄到了i k這個位置,現在需要計算p i k 定義maxlen是i k位置前所...

LeetCode 求解最長回文長度

求解最長回文的問題有多種解法,這裡對複雜度為o n 的manacher演算法進行簡單的介紹 manacher演算法主要解決了兩個問題 下面就來看看具體是怎麼解決這兩個問題的吧!回文字串可能出現abba,aba兩種情況,對於abba其中心點bb,aba中心點為a,那麼對於要求解的字串,通過首尾及間隔插...

最長回文長度 manacher(馬拉車)

給出乙個只由小寫英文本元a,b,c y,z組成的字串s,求s中最長回文串的長度.回文就是正反讀都是一樣的字串,如aba,abba等 input 輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c y,z組成的字串s 兩組case之間由空行隔開 該空行不用處理 字串長度len 1...