如何找到字串中的最長回文子串

2021-08-30 15:10:03 字數 1607 閱讀 1310

例如:

第3位為中心: c a b a d a b a e

第5位為中心: c a b a d a b a e

我們已經知道了第3位為中心的a b a和第5位為中心的a b a d a b a是回文,那麼判斷第7位為中心的回文串的時候,由於回文的特性,就能夠知道2-4和6-8對稱

1. c a b a d a b a e  2-4位與6-8對稱

2. c a b a d a b a e  2-4位是回文

3. c a b a d a b a e  推斷6-8位也是回文

以第6位為中心,由於第4位的回文長度是1,所以它也只能是1,不需要再擴充套件區判斷了

以第7位為中心的回文串計算,由之前分析已經知道最小長度是3了,而且從5位的回文中心來看,我們只知道第8位是什麼,到是具體第九位是什麼,根據之前的資訊我們無法得知,因此需要進行中心擴充套件

演算法步驟:

1.對字串預處理,因為字串可能為偶數,加入特殊符號#

2.然後遍歷字串,用乙個陣列來記錄以該字串為中心的回文長度,為了方便計算,在陣列中存放記錄長度的一半

3.每一次遍歷字串,如果該字串在已知回文串最右邊界的覆蓋下,那麼就計算其相對右邊界回文串中心對稱的位置,得出已知回文串的長度;

4.判斷該長度和右邊界,如果達到右邊界,那麼需要進行中心擴充套件.當然,如果第3步該字元沒有在右邊界的覆蓋下,則直接進行中心擴充套件,進行中心擴充套件的同時更新右邊界.

5.去掉特殊符號

**如下

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace solution

static string longestpalindrome(string s)

//如果根據已知條件計算得出的最長回文小於右邊界,則不需要擴充套件

if (halflenarr[leftcenter] + i < rightside)

}if (needcal)

else

} 更新回文中心以及右邊界的值

rightcenter = i;

rightside = i + halflenarr[i];

//當前回文長度與最長回文長度做判斷

if (halflenarr[i] > longest)}}

去掉特殊字串(去掉#)

stringbuilder sb = new stringbuilder();

for (int i = center - longest + 1; i <= center + longest; i += 2)

return sb.tostring();

}/// /// 預處理字串

///

///

///

private static string prehandlestring(string s)

return sb.tostring();}}

}

字串 最長回文子串

最長回文子串 回文子串 即正著看和倒著看相同的子串,如 abcba yyxyy。由於此類題目為面試筆試常考題目,所以現在就來整理一下啦。1 暴力求解法 最直接的想法就是暴力求解,但是我們可以看到下面的 時間複雜度是o n 3 string findlongeststring string str 暴...

字串 最長回文子串

介紹一下幾個概念 就是從左往右和從右往左讀是一樣的。就如標語 我為人人,人人為我 子串,顧名思義,就是在原字串中的子集,就叫子串。串就是不能分割的,就是連在一起,這個要區別與子串行,子串行就是一段 一段的。列舉各個起點和終點,然後進行判斷該子串是否為回文,最後就是更新最長的回文串。列舉起點和終點 o...

字串 最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 思路 用manacher class solution int max 1 int res 0 儲存最...