演算法 最長回文子串(思路 實現)

2021-09-28 19:34:51 字數 1626 閱讀 2711

題目描述:

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

示例 1:

輸入: "babad"

輸出: "bab"

注意: "aba" 也是乙個有效答案。

示例 2:

輸入: "cbbd"

輸出: "bb"

首先可以使用暴力法,將該字串的每個子串都得到,然後再在所有子串中找到最長的回文子串。

實現**如下:

public class 最長回文子串暴力法求解 

string res="";

//遍歷字串

for(int i=0;ires.length()&&ispalindromestr(tmp))

}} return res;

} //判斷是否是回文串

public static boolean ispalindromestr(string str)

} return true;

} public static void main(string args)

}

這樣的空間複雜度是o(n^3) 非常慢,在一些刷題**上一般是超時的。

接下來使用中心擴充套件法進行求解

思路:使用中心擴充套件法求解最長回文子串問題:回文串是從中間開始左右兩邊的對應位置的字元相同,因此可以讓每乙個位置都做一次回文串中心,

分別向前後遍歷該字串,但是存在兩種情況,1. 當回文串的長度是奇數時   2. 當回文串的長度是偶數時

1. 當回文串的長度為奇數時,字串中每個字元都需要做乙個回文串的中心,因此需要有 n 次判斷是否是回文串

2. 當回文串的長度是偶數時,字串中每兩個字元分別需要做一次中心(也可以理解為每兩個字元的中間的間隙做一次回文串中心)

因此需要有 n-1 次判斷是否是回文串。

因此判斷的總次數是:2n-1 次

具體實現為每次將當前位置作為偶數回文字串和奇數回文字串進行對待,然後得出這兩個回文字串中最長的乙個,和當前最長回文子串進行比較並更新。

實現**如下:

public class 最長回文子串 

//最長回文子串的其實下標和結束下標

int start=0,end=0;

//遍歷字串

for(int i=0;iend-start)

} //返回最終結果

return str.substring(start, end+1);

} //得到當前位置為中心的回文子串的長度

public static int getpalindromelen(string str,int start,int end)

//這裡是end-start-1的原因:

//當最後一次不相等時,是start和end分別往前往後各移動了一下,所以說它們比實際子串多算了兩個字元,但是因為下標是從0開始的,因此實際長度也比當前end-start多加了個1,因此應該減掉這個1

return end-start-1;

} public static void main(string args)

}

最長回文子串(manacher演算法實現)

include using namespace std define m 1000 void manacher char str,char maxpalindrome str接受原始字串 maxpalindrome儲存最長回文子串 cout i rad i rad 2 id i mx i rad 2...

演算法 最長回文子串

題目描述 對於乙個字串,請設計乙個高效演算法,計算其中最長回文子串的長度。給定字串a以及它的長度n,請返回最長回文子串的長度。例如 輸入 abc1234321ab 12 返回值 7 最長回文子串 public static intgetlongestpalindrome string a,int n...

最長回文串 演算法 4 求解最長回文子串

問題描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。注釋 回文通俗的說就是正著念和反著念都一樣,如 上海自來水來自海上。示例 1 輸入 dabccbac 輸出 abccba 示例 2 輸入 cbbd 輸出 bb 解題思路 此處撰寫解題思路 遍歷每乙個索引,...